社区讨论

二分求调!

P7913[CSP-S 2021] 廊桥分配参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m1vqd3f4
此快照首次捕获于
2024/10/05 13:45
去年
此快照最后确认于
2025/11/04 18:00
4 个月前
查看原帖
主要思路是查找最先到达且能使用同一个廊桥的
CPP
#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;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...