社区讨论
二分求调!
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 条回复,欢迎继续交流。
正在加载回复...