codeforces1462F. The Treasure of The Segments

https://codeforces.com/contest/1462/problem/F

直接离散化然后搞in,out我们可以算出每个点被now个区间覆盖了

这题我们要找到与其他区间相交最多的区间是哪一个

那么记录r[i]表示从包含i的区间最右边在哪里,那么这个区间相交的区间数就是now+sum[r[i]]-sum[i],now表示l<=i且r>=i的区间,一定与当前区间相交,剩下与当前区间相交的数量就是a[i].l在i+1到r[i]之间的了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxl=4e5+10;

int n,m,k,cnt,tot,cas,ans;
int num[maxl],in[maxl],out[maxl],r[maxl],sum[maxl];
struct seg
{
	int l,r;
}a[maxl];
bool vis[maxl];
char s[maxl];

inline int id(int x)
{
	return lower_bound(num+1,num+1+tot,x)-num;
}

inline void prework()
{
	scanf("%d",&n);
	tot=0;
	for(int i=1;i<=n;i++)
	{
		int x,y;scanf("%d%d",&x,&y);
		a[i]=seg{x,y};num[++tot]=x;num[++tot]=y;
	}
	sort(num+1,num+1+tot);
	tot=unique(num+1,num+1+tot)-num-1;
	for(int i=1;i<=tot;i++)
		in[i]=out[i]=r[i]=sum[i]=0;
	for(int i=1;i<=n;i++)
	{
		a[i].l=id(a[i].l);a[i].r=id(a[i].r);
		in[a[i].l]++;r[a[i].l]=max(r[a[i].l],a[i].r);
		out[a[i].r]++;
	}
	for(int i=1;i<=tot;i++)
	{
		sum[i]=sum[i-1]+in[i];
		if(r[i-1]>=i)
			r[i]=max(r[i-1],r[i]);
	}
}

inline void mainwork()
{
	int now=0;ans=0;
	for(int i=1;i<=tot;i++)
	{
		now+=in[i];
		if(now>0 && r[i]>=i)
		{
			ans=max(ans,now+sum[r[i]]-sum[i]);
		}
		now-=out[i];
	}
}

inline void print()
{
	printf("%d\n",n-ans);
}

int main()
{
	int t=1;
	scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/111243993
今日推荐