比赛 CSP2022提高组 评测结果 WWWAAAAAWAWWAAAAWWWW
题目名称 星战 最终得分 50
用户昵称 yrtiop 运行时间 6.215 s
代码语言 C++ 内存使用 61.05 MiB
提交时间 2022-10-30 12:29:32
显示代码纯文本
#include <bits/stdc++.h>
#define pb emplace_back

const int maxn = 5e5 + 5;
std::set<int> s[maxn],G[maxn],QAQ,qwq;
int n,m,deg[maxn],cur[maxn],tag[maxn],sz[maxn],lst[maxn];

int main() {
	freopen("csp2022_galaxy.in","r",stdin);
	freopen("csp2022_galaxy.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i = 1;i <= m;++ i) {
		int u,v;
		scanf("%d %d",&u,&v);
		G[v].emplace(u);
		++ deg[u];
		++ sz[v];
	}
	int cnt = 0,ans = 0;
	for(int u = 1;u <= n;++ u) {
		cur[u] = deg[u];
		cnt += deg[u];
		ans += deg[u] == 1;
	}
	int Q;
	scanf("%d",&Q);
	while(Q --) {
		int op,u,v;
		scanf("%d %d",&op,&u);
		if(op == 1) {
			scanf("%d",&v);
			ans -= cur[u] == 1;
			-- cur[u];
			-- cnt;
			G[v].erase(u);
			s[v].emplace(u);
			-- sz[v];
		}
		else if(op == 2&&sz[u]) {
			++ tag[u];
			cnt -= sz[u];
			lst[u] = sz[u];
			sz[u] = 0;
			QAQ.emplace(u);
		}
		else if(op == 3) {
			scanf("%d",&v);
			++ cur[u];
			++ cnt;
			++ sz[v];
			ans += cur[u] == 1;
			s[v].erase(u);
			G[v].emplace(u);
		}
		else if(sz[u] < lst[u]){
			-- tag[u];
			sz[u] = lst[u];
			if(QAQ.find(u) == QAQ.end())qwq.emplace(u);
			else QAQ.erase(u);
		}
		if(cnt != n) {
			puts("NO");
			continue ;
		}
		for(auto& u : QAQ) {
			std::vector<int> g;
			for(auto& v : G[u]) {
				ans -= cur[v] == 1;
				-- cur[v];
				g.pb(v);
			}
			G[u].clear();
			for(auto& v : g)s[u].emplace(v);
		}
		for(auto& u : qwq) {
			std::vector<int> g;
			for(auto& v : s[u]) {
				++ cur[v];
				ans += cur[v] == 1;
				g.pb(v);
			}
			s[u].clear();
			for(auto& v : g)G[u].emplace(v);
		}
		if(ans == n)puts("YES");
		else puts("NO");
	}
	return 0;
}