求助廊桥分配!!
查看原帖
求助廊桥分配!!
241817
Chancylaser楼主2021/10/31 21:22
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int n,m1,m2;
struct gn{
	int a,b;
}f1[100005];
struct gw{
	int a,b;
}f2[100005];
bool cmp(gn x,gn y){
	return x.a<y.a;
}
bool cmp2(gw x,gw y){
	return x.a<y.a;
}
int k1,ln[100005],res[100005];
void lqfp(){
	priority_queue<pair<int,int> > lq;
	priority_queue<pair<int,int> > lq2;
	lq.push(make_pair(-f1[1].b,1));k1=1;
	ln[1]++;
	for(int i=2;i<=m1;i++){
		int x=-lq.top().first,y=1e9;
		if(x<f1[i].a){
			while(x<f1[i].a&&!lq.empty()){
				x=-lq.top().first;
				if(x>=f1[i].a) break;
				lq2.push(lq.top());
				y=min(y,lq.top().second);
				lq.pop();
			} 
			ln[y]++;	
			lq.push(make_pair(-f1[i].b,y));
			while(!lq2.empty()){
				if(lq2.top().second==y){
					lq2.pop();	
					continue;
				}
				lq.push(lq2.top());
				lq2.pop();
			}
		} 
		else{
			ln[++k1]++;
			lq.push(make_pair(-f1[i].b,k1)); 	
		} 
	}
	for(int i=1;i<=n;i++){
		if(i>k1){
			res[i]=res[k1];
			continue;
		}
		res[i]=res[i-1]+ln[i];
	}
	return;
}
int k2,lw[100005],ans[100005];
void lqfp2(){
	priority_queue<pair<int,int> > lq;
	priority_queue<pair<int,int> > lq2;
	lq.push(make_pair(-f2[1].b,1));k2=1;
	lw[1]++;
	for(int i=2;i<=m2;i++){
		int x=-lq.top().first,y=1e9;
		if(x<f2[i].a){
			while(x<f2[i].a&&!lq.empty()){
				x=-lq.top().first;
				if(x>=f2[i].a) break;
				lq2.push(lq.top());
				y=min(y,lq.top().second);
				lq.pop();
			} 
			lw[y]++;	
			lq.push(make_pair(-f2[i].b,y));
			while(!lq2.empty()){
				if(lq2.top().second==y){
					lq2.pop();	
					continue;
				}
				lq.push(lq2.top());
				lq2.pop();
			}
		} 
		else{
			lw[++k2]++;
			lq.push(make_pair(-f2[i].b,k2)); 	
		} 
	}
	for(int i=1;i<=n;i++){
		if(i>k2){
			ans[i]=ans[k2];
			continue;
		}
		ans[i]=ans[i-1]+lw[i];
	}
	return;
}
int zans=0;
int main(){
//	freopen("std.out","r",stdin);
	n=read(),m1=read(),m2=read();
	for(int i=1;i<=m1;i++)
		f1[i].a=read(),f1[i].b=read();
	for(int i=1;i<=m2;i++)
		f2[i].a=read(),f2[i].b=read();
	sort(f1+1,f1+m1+1,cmp);sort(f2+1,f2+m2+1,cmp2);
	lqfp();lqfp2();
	for(int i=0;i<=n;i++){
		int sum1=i,sum2=n-i;
		zans=max(zans,res[sum1]+ans[sum2]);
	}
	printf("%d\n",zans);
	return 0;
}

思路大概是从前往后先算出这个飞机应该停在哪个廊桥

然后做操作

本地测1e5数据大概在0.8s到3s之间,求优化!

2021/10/31 21:22
加载中...