并查集优化 - 按大小合并时间复杂度证明
并查集优化 - 按大小合并时间复杂度证明
if(sz[b[x]].size() > sz[b[y]].size()) swap(x, y);
- 对于每个元素,当它当前所在的集合中,需要有其它大于该集合大小的集合,才会被遍历
- 如果元素在一个大小
的集合中,会转移到大小 的集合中 - 如果元素在一个大小
的集合中,会转移到大小 的集合中 - 如果元素在一个大小
的集合中,会转移到大小 的集合中 - 如果元素在一个大小
的集合中,会转移到大小 的集合中 - 因为一开始就进行按秩合并所以每次转移到两倍大小的集合中
- 所以每个元素转移
次 - 那么总共
并查集暴力 AC
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int MAXN = 4e6 + 3;
const LL mod = 998244353;
int n, m, b[MAXN];
LL ANS = 0;
vector<int> sz[MAXN];
int main(){
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m;
for(int i = 0; i < n; i++) sz[i].push_back(i), b[i] = i;
for(int i = 1, opt, x, y; i <= m; i++){
cin >> opt >> x >> y;
if(opt == 0){
if(b[x] == b[y]) continue;
if(sz[b[x]].size() > sz[b[y]].size()) swap(x, y);
for(int z : sz[b[x]]){
sz[b[y]].push_back(z);
b[z] = b[y];
}
}else{
ANS *= 2, ANS += (b[x] == b[y]);
ANS %= mod;
}
}
cout << ANS;
return 0;
}
本文作者:hhhqx
本文链接:https://www.cnblogs.com/huangqixuan/p/17589400.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步