二分求调!
查看原帖
二分求调!
654798
luoyuai楼主2024/10/5 13:44

主要思路是查找最先到达且能使用同一个廊桥的

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m1,m2;
int s1[N],s2[N],cnt1,cnt2,bac,ans;
struct node{
	int a,b,id=0;
}q1[N],q2[N];
bool cmp(node x,node y){
	return x.a<y.a;
}
bool check(int x,node q[]){
	if(q[x].a<bac||q[x].id)return 0;
	return 1;
}
void solve(int m,node q[],int s[],int cnt){
	for(int i=1;i<=m;i++){
		if(!q[i].id){
			cnt++,q[i].id=cnt,s[cnt]++,bac=q[i].b;
			int l=i,r=m;
			while(1){
				//cout<<cnt<<" "<<s[cnt]<<" \n";
				while(l<r){
					int mid=(l+r)>>1;
					if(check(mid,q))r=mid;
					else l=mid+1;
				}
				if(check(l,q))
					q[l].id=cnt,s[cnt]++,bac=q[l].b,r=m;
				else
					break;
			}
			//cout<<"\n";
		}
	}
}
int main(){
	//freopen("airport3.in","r",stdin);
	//freopen("airport3.out","w",stdout);
	cin>>n>>m1>>m2;
	for(int i=1;i<=m1;i++)cin>>q1[i].a>>q1[i].b;
	for(int i=1;i<=m2;i++)cin>>q2[i].a>>q2[i].b;
	sort(q1+1,q1+1+m1,cmp);
	sort(q2+1,q2+1+m2,cmp);
	solve(m1,q1,s1,cnt1);solve(m2,q2,s2,cnt2);
//	for(int i=1;i<=m1;i++)cout<<s1[i]<<" ";
//	cout<<"\n";
//	for(int i=1;i<=m2;i++)cout<<s2[i]<<" ";
//	cout<<"\n";
	
	for(int i=2;i<=m1;i++)s1[i]+=s1[i-1];
	for(int i=2;i<=m2;i++)s2[i]+=s2[i-1];
	for(int i=0;i<=n;i++)ans=max(s1[i]+s2[n-i],ans);
	cout<<ans;
}
2024/10/5 13:44
加载中...