专栏文章
题解: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 了?我不是成废物了?(机房 个人有 个场切 E,但只有 个场切 D)
并查集维护所有的连通块,用 代表以 为根的连通块的黑色点数目。
因为要知道所有点的颜色,再开 代表每一个点的颜色。
一个要注意的细节是在合并时,要把一个连通块的答案加到另外一个连通块上。
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 条评论,欢迎与作者交流。
正在加载评论...