社区讨论

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 条回复,欢迎继续交流。

正在加载回复...