专栏文章

题解:AT_abc420_e [ABC420E] Reachability Query

AT_abc420_e题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio59iws
此快照首次捕获于
2025/12/02 13:35
3 个月前
此快照最后确认于
2025/12/02 13:35
3 个月前
查看原文
什么时候全机房都能切 E 了?我不是成废物了?(机房 1313 个人有 1212 个场切 E,但只有 88 个场切 D)

并查集维护所有的连通块,用 ansians_i 代表以 ii 为根的连通块的黑色点数目。
因为要知道所有点的颜色,再开 colicol_i 代表每一个点的颜色。
一个要注意的细节是在合并时,要把一个连通块的答案加到另外一个连通块上。
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;

inline int read(){
	int a=0,b=1;
	char c=getchar();
	while(!isdigit(c)){
		if(c=='-')	b=-1;
		c=getchar();
	}
	while(isdigit(c)){
		a=(a<<1)+(a<<3)+(c-'0');
		c=getchar();
	}
	return a*b;
}
inline void write(int x){
	if(x<0)	putchar('-'),x=-x;
	if(x>=10)	write(x/10);
	putchar(x%10+48); 
}
inline void write1(int x){
	write(x),putchar(' ');
}
inline void write2(int x){
	write(x),putchar('\n');
}
int n,q;
int fa[6*114514];
int ans[6*114514];	//代表 fa 块内的黑色点数目! 
int find(int u){
	if(fa[u]==u)	return u;
	fa[u]=find(fa[u]);
//	ans[fa[u]]+=ans[u];
	if(fa[u]!=u) ans[fa[u]]+=ans[u],ans[u]=0;
	return fa[u];
} 
int col[6*114514];
signed main(){
	n=read(),q=read();
	for(int i=1;i<=n;i++){
		fa[i]=i;
//		cout<<fa[i]<<endl;
	} 
	while(q--){
		int op=read();
		switch(op){
			case 1:{
				int u=read(),v=read();
				u=find(fa[u]),v=find(fa[v]);
				if(u!=v){
					fa[u]=v;
					ans[v]+=ans[u],ans[u]=0;
				}
				
				break;
			}
			case 2:{
				int v=read();
				if(col[v]==0){
					col[v]=1;
					v=find(fa[v]);
					ans[v]++;
				}
				else{
					col[v]=0;
					v=find(fa[v]);
					ans[v]--;
				}
				break;
			}
			case 3:{
				int v=read();
				v=find(fa[v]);
				puts(ans[v]?"Yes":"No");
				break;
			}
		}
		for(int i=1;i<=n;i++){
//			int u=find(fa[i]);
//			cout<<fa[i]<<' ';
//			cout<<ans[i]<<' ';
		}
//		cout<<endl;
	}
	putchar('\n');
	return 0;
} //ABC420E 

评论

0 条评论,欢迎与作者交流。

正在加载评论...