AT_abc355_d 题解
提示
- 正难则反,可以总数减去无交集的部分;
- 与 无交集的条件是 或
- 二分是个好东西。
思路
上面基本已经说了大致思路。我们设 为原数组, 也是原数组,但是单独排序了。然后我们枚举每个 ,只要分别二分一下 和 的数量即可。最后注意这个总和要除以 ,因为会把 和 都算进去。
代码
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int n, l[500005], r[500005];
ll sum;
pii a[500005];
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> n;
for (int i = 0; i < n; ++ i)
cin >> l[i] >> r[i], a[i] = {l[i], r[i]};
sort (l, l + n), sort (r, r + n);
for (int i = 0; i < n; ++ i)
sum += (lower_bound (r, r + n, a[i].first) - r) + (l + n - upper_bound (l, l + n, a[i].second));
cout << n * (n - 1ll) / 2 - sum / 2;
return 0;
}

浙公网安备 33010602011771号