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;
}
posted @ 2024-10-14 15:48  coding_goat_qwq  阅读(2)  评论(0编辑  收藏  举报