CF1462F Solution

题目翻译

题解

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

若使两个区间(i,j)重叠,只需满足(r_jge l_i)且$l_jle r_i (,当然)i,j(可以互换,但为了不重复计数令)i(区间在左侧。进一步思考可知,所有满足)l_j> r_i (的)j(一定满足)r_jge l_i(,因此用满足)r_jge 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
",ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/violetholmes/p/14220568.html