社区讨论
40分求调(悬赏关注)
P8819[CSP-S 2022] 星战参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo2bsb6g
- 此快照首次捕获于
- 2023/10/23 11:15 2 年前
- 此快照最后确认于
- 2023/11/03 11:25 2 年前
蒟蒻用的出度和入度做的,题解好像也是用的这个方法,但蒟蒻太弱了,不知道怎么判断一个据点被破坏前所连的虫洞有没有被破坏。样例没过,但提交后居然得了四十分
CPP#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,m;
int outdegree[N],indegree[N],ft[N],sum,out_degree[N],in_degree[N];
bool vis[N];
struct Edge{
int v,next;
}edge[N];
int head[N],ce;
inline void Put(string a){
for(int i=0;i<a.length();i++) putchar(a[i]);
putchar('\n');
}
inline void adde(int u,int v){
outdegree[u]++;indegree[v]++;
edge[++ce].v=u,edge[ce].next=head[v],head[v]=ce;
// fa[u][++ft[u]]=v;
out_degree[u]++;
in_degree[v]++;
if(!vis[u]&&outdegree[u]==1)sum--,vis[u]=true;
else if(vis[u]&&outdegree[u]!=1) sum++,vis[u]=false;
}
inline void delside(int u,int v){
outdegree[u]=max(0,outdegree[u]-1);
indegree[v]=max(0,indegree[v]-1);
if(vis[u]&&outdegree[u]!=1) sum++,vis[u]=false;
else if(!vis[u]&&outdegree[u]==1) sum--,vis[u]=true;
}
inline void delpoint(int u){
for(int i=head[u];i;i=edge[i].next)
delside(edge[i].v,u);
}
inline void addside(int u,int v){
outdegree[u]=min(out_degree[u],outdegree[u]+1);
indegree[v]=min(in_degree[v],indegree[v]+1);
if(vis[u]&&outdegree[u]!=1) sum++,vis[u]=false;
else if(!vis[u]&&outdegree[u]==1) sum--,vis[u]=true;
}
inline void addpoint(int u){
for(int i=head[u];i;i=edge[i].next)
addside(edge[i].v,u);
}
inline void sentence(){
if(sum==0) Put("YES");
else Put("NO");
}
int q,opt;
inline void work(){
scanf("%d%d",&n,&m);
sum=n;
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
adde(u,v);
}
// for(int i=head[1];i;i=edge[i].next) cout<<1<<" "<<edge[i].v<<endl;
scanf("%d",&q);
while(q--){
scanf("%d",&opt);
if(opt==1){
int u,v;
scanf("%d%d",&u,&v);
delside(u,v);
}
else if(opt==2){
int u;
scanf("%d",&u);
delpoint(u);
}
else if(opt==3){
int u,v;
scanf("%d%d",&u,&v);
addside(u,v);
}else{
int u;
scanf("%d",&u);
addpoint(u);
}
// cout<<sum<<endl;
// for(int i=1;i<=n;i++)cout<<vis[i]<<" "<<outdegree[i]<<" "<<indegree[i]<<endl;
sentence();
}
}
int main(){
work();
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...