题目:
题意:
维护一个n点的无向图,对其进行m个操作,支持加入一条连接和的无向边以及查询和的连通性,将每次查询的结果依次排序得到一个串,把得到的串视为一个二进制数,输出这个二进制数mod 998244353的值。
分析:
一道并查集的模板题,套模板就行,唯一需要思考的是如果处理得到的串。根据二进制数的特点,只需要定义一个sum表示之前所有查询结果得到的串的值,初始化sum=0,之后每得到一个查询结果就将sum乘2再加上查询结果(0或1)便可。注意使用快读。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,f[5000000];
int read(){
int f=1,k=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
k=k*10+c-'0';
c=getchar();
}
return f*k;
}
int father(int x){
if (f[x]==x) return x;
else return f[x]=father(f[x]);
}
int main(){
n=read();
m=read();
for (int i=0;i<n;i++){
f[i]=i;
}
int sum=0;
for (int i=1;i<=m;i++){
int p,x,y;
p=read();
x=read();
y=read();
if (p==0) f[father(x)]=father(y);
else sum=(sum*2+(father(x)==father(y)))%998244353;
}
printf("%d",sum);
}