题目
这是一道模板题。
维护一个 n 点的无向图,支持:
- 加入一条连接 u 和 v 的无向边
- 查询 u 和 v 的连通性
由于本题数据较大,因此输出的时候采用特殊的输出方式:用 0 或 1 代表每个询问的答案,将每个询问的答案依次从左到右排列,把得到的串视为一个二进制数,输出这个二进制数mod 998244353 的值。
请务必使用快读。
输入格式
第一行包含两个整数 n,m,n≤4000000,m≤8000000,表示点的个数和操作的数目。
接下来 m 行每行包括三个整数 op,u,v。
如果 op=0,则表示加入一条连接 u 和 v 的无向边;
如果 op=1,则表示查询 u 和 v 的连通性。
输出格式
一行包括一个整数表示答案。
样例
Inputcopy | Outputcopy |
---|---|
3 6 1 1 0 0 0 1 1 0 1 1 1 2 0 2 1 1 2 1 | 5 |
思路
并查集模板,注意题目要求的输出格式。
代码
#include<iostream>
using namespace std;
long long n, m, op, u, v, mod = 998244353, fa[4000005], ans = 0;
void inti(int n)
{
for (int i = 1; i <= n; ++i)
{
fa[i] = i;
}
}
int find(long long x)
{
if (fa[x] == x)
{
return x;
}
else
{
fa[x] = find(fa[x]);
return fa[x];
}
}
void merge(long long x, long long y)
{
fa[find(x)] = find(y);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
inti(n);
for (int i = 0; i < m; ++i)
{
cin >> op >> u >> v;
if (!op)
{
merge(u, v);
}
else
{
if (find(u) == find(v))
{
ans *= 2;
++ans;
ans %= mod;
}
else
{
ans *= 2;
ans %= mod;
}
}
}
cout << ans;
return 0;
}