题解:CF420C Bug in Code
__Groyhj__QwQ · · 题解
CF420C Bug in Code 题解
CF:Link。
1. 思路分析
我们可以用一个数组
那么,题意就可以转化为:求满足
但是,真的是这样吗?
显然,当一个鸭鸭同时投给了
因此,我们的题意又可以修改为:求满足 map 统计即可,注意是无序的。
但是我们发现这样并不好统计,于是我们可以先统计满足
我们可以用双指针统计满足
::::info[具体地:]{open}
首先,我们将数组
所以,我们定义两个指针
::::
最后,我们要减去同时满足 map 存的 map,然后再进行判断:如果满足条件,就把答案减一。因为我们只输入了
2. AC 代码
AC 记录。
#include <bits/stdc++.h>
#define int long long
#define pii pair<int, int>
using namespace std;
int a[300005], b[300005];
map<pii, int> mp;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int x, y;
cin >> x >> y;
a[x]++;
a[y]++;
if (x > y)
swap(x, y);
mp[{x, y}]++;
}
for (int i = 1; i <= n; i++) {
b[i] = a[i];
}
int ans = 0;
sort(b + 1, b + n + 1);
for (int i = 1, j = n; i <= n; i++) {
if (i > j)
j = i;
while (i < j && b[i] + b[j] >= m) {
j--;
}
ans += n - j;
}
for (auto [i, j] : mp) {
if (a[i.first] + a[i.second] >= m && a[i.first] + a[i.second] - j < m) {
ans--;
}
}
cout << ans;
return 0;
}