CF1139E Maximize Mex 做题记录
没有出现的最小的非负整数,想到二分图最大匹配,将能力值放在左部,社团编号放在右部。我不会删除边之后的二分图是怎么做的,于是反着加入这些学生。对于每一次暴力做,时间复杂度 \(O(Vdm)\),过不了这道题。
注意到加入学生时有一个性质,他只会使得这张图的匹配数增大,于是不用每一次加入学生时都重新做一遍,在之前的基础上继续做即可,时间复杂度 \(O(Vm)\)。
代码
int n,m,d;
int p[maxn],c[maxn],k[maxn];
bool vis[maxn];
vector<int>G[maxn];
int ans[maxn];
int to[maxn];
int Vis[maxn];
bool dfs(int now,int tag) {
for(auto v:G[now]){
if(Vis[v]!=tag) {
Vis[v]=tag;
if(to[v]<0||dfs(to[v],tag)) return to[v]=now,1;
}
}
return 0;
}
int lst=0;
int work() {
m0(Vis);
int cnt=0;
for(;lst<=m;lst++) {
cnt++;
if(!dfs(lst,cnt)) return lst;
}
return m+1;
}
signed main() {
mem(to,-1);
in2(n,m);
For(i,1,n) in1(p[i]);
For(i,1,n) in1(c[i]);
in1(d); For(i,1,d) in1(k[i]),vis[k[i]]=1;
For(i,1,n) if(!vis[i]) {
G[p[i]].push_back(c[i]);
}
Rep(i,d,1) {
ans[i]=work();
G[p[k[i]]].push_back(c[k[i]]);
}
For(i,1,d) cout<<ans[i]<<'\n';
return 0;
}
本文来自博客园,作者:coding_goat_qwq,转载请注明原文链接:https://www.cnblogs.com/CodingGoat/p/18464352