AT_abc355_d 题解

提示

  1. 正难则反,可以总数减去无交集的部分;
  2. iijj 无交集的条件是 rj<lir_j<l_ilj>ril_j>r_i
  3. 二分是个好东西。

思路

上面基本已经说了大致思路。我们设 l,rl,r 为原数组,L,RL,R 也是原数组,但是单独排序了。然后我们枚举每个 ii,只要分别二分一下 Rj<liR_j<l_iLj>riL_j>r_i 的数量即可。最后注意这个总和要除以 22,因为会把 i<ji<ji>ji>j 都算进去。

代码

# 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;
}
posted @ 2024-05-26 16:22  Vitamin_B  阅读(11)  评论(0)    收藏  举报  来源