比赛 |
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;
}