挥泪请求加强数据
查看原帖
挥泪请求加强数据
191281
Jr_Zlw楼主2021/10/24 14:18

code

#include<bits/stdc++.h>
#define rep(a,b,c) for(int c=(a);c<=(b);++c)
#define drep(a,b,c) for(int c=(a);c>=(b);--c)
using namespace std;
inline int read()
{
	int res=0;char ch=getchar();bool flag=0;
	while(ch<'0'||ch>'9')flag^=(ch=='-'),ch=getchar();
	while(ch<='9'&&ch>='0')res=res*10+(ch^48),ch=getchar();
	return flag ? -res : res ;
}
const int N=8e5+10,NN=8e5+10;
int n,m1,m2;int L1[N],R1[N],L2[N],R2[N],P[NN],pp,loc[NN];short a[NN];
inline int fnd(int k)
{
	int l=1,r=pp,res,mid;
	while(l<=r)P[mid=(l+r)>>1]<=k?(l=mid+1,res=mid):(r=mid-1);
	return res;
}
namespace Sub1
{
	bool vis[N];inline int check(int A,int B)
	{
		int c1=0,c2=0,ans=0;rep(1,pp,i)
		{
			if(a[i]==1&&c1<A)++c1,++ans,vis[loc[i]]=1;
			if(a[i]==2&&c2<B)++c2,++ans,vis[loc[i]+m1]=1;
			if(a[i]==-1&&vis[loc[i]])--c1,vis[loc[i]]=0;
			if(a[i]==-2&&vis[loc[i]+m1])--c2,vis[loc[i]+m1]=0;
		}
		return ans;
	}
	inline void mian()
	{
		int ans=0;rep(0,n,i)ans=max(ans,check(i,n-i));
		printf("%d\n",ans);return;
	}
}
namespace Sub2
{
	int vis[N],vis2[N],an[N],an2[N];
	priority_queue<int, vector<int> , greater<int> > h;
	inline void mian()
	{
		rep(1,m1,i)h.push(i);
		rep(1,pp,i)
		{
			if(a[i]==1){vis[loc[i]]=h.top();h.pop();}
			if(a[i]==-1){h.push(vis[loc[i]]);}
		}
		while(!h.empty())h.pop();
		rep(1,m2,i)h.push(i);
		rep(1,pp,i)
		{
			if(a[i]==2){vis2[loc[i]]=h.top();h.pop();}
			if(a[i]==-2){h.push(vis2[loc[i]]);}
		}
		rep(1,m1,i)++an[vis[i]];rep(1,m2,i)++an2[vis2[i]];
		rep(1,m1,i)an[i]+=an[i-1];rep(1,m2,i)an2[i]+=an2[i-1];
		int ans=0;rep(0,n,i)ans=max(ans,an[i]+an2[n-i]);
		printf("%d\n",ans);return;
	}
}
int main()
{
//	freopen("airport.in","r",stdin);
//	freopen("airport.out","w",stdout);
	n=read(),m1=read(),m2=read();
	rep(1,m1,i)P[++pp]=L1[i]=read(),P[++pp]=R1[i]=read();
	rep(1,m2,i)P[++pp]=L2[i]=read(),P[++pp]=R2[i]=read();
	sort(P+1,P+pp+1);
	rep(1,m1,i)L1[i]=fnd(L1[i]),R1[i]=fnd(R1[i]);
	rep(1,m2,i)L2[i]=fnd(L2[i]),R2[i]=fnd(R2[i]);
	rep(1,m1,i)a[L1[i]]=1,a[R1[i]]=-1,loc[L1[i]]=loc[R1[i]]=i;
	rep(1,m2,i)a[L2[i]]=2,a[R2[i]]=-2,loc[L2[i]]=loc[R2[i]]=i;
	if(n<=5000&&m1+m2<=5000)Sub2::mian();//这里为了hack特判过,考场程序为Sub1::mian();但大数据同理,Sub2会在n<=m1+m2时炸
	else Sub2::mian();return 0;
}

hack:

1000 2 2
1 2
3 4
5 6
7 8

answer

4

output

2

没判n<=m1+m2

2021/10/24 14:18
加载中...