做题记录整理枚举3 P7913. [CSP-S 2021] 廊桥分配(2022/9/9)
上一年csp在考场上只打出暴力的题。。。
难点就是想到应该从国内和国外每次多一个廊桥而产生的变化来处理
也就是从使用i-1个廊桥推出使用i个廊桥(考场上想都没想过。。。)
还有一个比较暴露我代码能力有待提高的就是set的和lower_bound运用
#include<bits/stdc++.h>
#define for1(i,a,b) for(int i=a;i<=b;i++)
#define mp(a,b) make_pair(a,b)
using namespace std;
set <pair <int ,int> > q;
set <pair <int ,int> >:: iterator ji;
int n,m1,m2;
struct node{
int dao;
int zou;
}a[500005],b[500005];
int nei[500005],wai[500005];
int main()
{
cin>>n>>m1>>m2;
for1(i,1,m1)
scanf("%d%d",&a[i].dao,&a[i].zou);
for1(i,1,m2)
scanf("%d%d",&b[i].dao,&b[i].zou);
for1(i,1,m1)
{
q.insert(mp(a[i].dao,a[i].zou));
}
int cnt=0,daan=0;
for1(i,1,n)
{
cnt=0,daan=0;
nei[i]=nei[i-1];
if(q.empty())
{
continue;
}
daan=(*q.begin()).second;
q.erase(*q.begin());
cnt++;
while(!q.empty())
{
if(q.lower_bound(mp(daan,0))==q.end()) break;
int jl=daan;
daan=(*q.lower_bound(mp(jl,0))).second;
q.erase(*q.lower_bound(mp(jl,0)));
cnt++;
}
nei[i]+=cnt;
}
q.clear();
for1(i,1,m2)
{
q.insert(mp(b[i].dao,b[i].zou));
}
cnt=0,daan=0;
for1(i,1,n)
{
cnt=0,daan=0;
wai[i]=wai[i-1];
if(q.empty())
{
continue;
}
daan=(*q.begin()).second;
q.erase(*q.begin());
cnt++;
while(!q.empty())
{
if(q.lower_bound(mp(daan,0))==q.end()) break;
int jl=daan;
daan=(*q.lower_bound(mp(jl,0))).second;
q.erase(*q.lower_bound(mp(jl,0)));
cnt++;
}
wai[i]+=cnt;
}
int ans=0;
for1(i,0,n) ans=max(nei[i]+wai[n-i],ans);
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号