CF1462F Solution

题目翻译

题解

容易想到\(O(n^2)\)的暴力,也就是对于每个区间依次枚举与之有重叠的区间。但是时间复杂度只允许在\(O(nlogn)\)及以内,因此需要考虑优化。

若使两个区间\(i,j\)重叠,只需满足\(r_j\ge l_i\)且$l_j\le r_i \(,当然\)i,j\(可以互换,但为了不重复计数令\)i\(区间在左侧。进一步思考可知,所有满足\)l_j> r_i \(的\)j\(一定满足\)r_j\ge l_i\(,因此用满足\)r_j\ge l_i\(的\)j\(的个数,减去满足\)l_j> r_i \(的\)j\(的个数即可得到与\)i\(重叠的区间个数。下面的代码用二分在\)logn$的时间中完成了上述解法,其实理论上离散化后用前缀和的方法也可得出解(但是写挂了QAQ)。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f;
int al[N],ar[N],l[N],r[N];
int main()
{
	int t,n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&al[i],&ar[i]);
			l[i]=al[i],r[i]=ar[i];
		}
		sort(l+1,l+n+1); sort(r+1,r+n+1);
		int ans=inf;
		for(int i=1;i<=n;i++)
		{
			int qwq=upper_bound(l+1,l+n+1,ar[i])-l,qaq=lower_bound(r+1,r+n+1,al[i])-r;
			ans=min(ans,n-qwq+qaq);
		}
		printf("%d\n",ans);
	}
	return 0;
}
posted @ 2021-01-01 18:32  violet_holmes  阅读(60)  评论(0编辑  收藏  举报