可持久化并查集(二)——从镜像到动态
来源:互联网 发布:阿里云多少钱一年 编辑:程序博客网 时间:2024/06/04 17:42
uva 11987
题目连接
code
#include<cstdio>#include<string>#include<iostream>#include<algorithm>using namespace std;const int MAXN = 100010;int n,m;int father[MAXN];int sum[MAXN],num[MAXN];template<class T>inline void readin(T &res){ static char ch; while((ch=getchar())<'0'||ch>'9');res=ch-48; while((ch=getchar())<='9'&&ch>='0')res=res*10+ch-48;}void init(){ for(int i=1;i<=n;i++){ father[i]=i+n; father[i+n]=i+n; sum[i+n]=i; num[i+n]=1; }}int find(int x){ return father[x]!=x?father[x]=find(father[x]):x;}int main(){ int mark,x,y; while(scanf("%d%d",&n,&m)!=EOF){ init(); for(register int i=0;i<m;i++){ readin(mark); if(mark==1){ readin(x),readin(y); int fx=find(x),fy=find(y); if(fx!=fy){ father[fx]=fy; sum[fy]+=sum[fx]; num[fy]+=num[fx]; } }else if(mark==2){ readin(x),readin(y); int fx=find(x),fy=find(y); if(fx!=fy){ father[x]=fy; sum[fy]+=x,sum[fx]-=x; num[fy]++,num[fx]--; } }else{ scanf("%d",&x); int fx=find(x); printf("%d %d\n",num[fx],sum[fx]); } } } return 0;}
紧接着囚犯的是伪可持久化并查集(动态并查集)
同样的,这里也用到了镜像的思想,以多开一倍空间来存储自己的另外一种状态。从而来实现动态的并查集father[i]=i+n;father[i+n]=i+n;
就是这样,i与i’(i+n)同时指向了i+n这样一个虚拟id,接下会发生什么就可以模拟了。如果x union y,则x指向y的虚拟id,重指y时并不会改变x及曾是x的子节点因并查集而变到f[y]只是指向一个虚拟id的事实,从而一切的动态移除,合并,统计就可以在并查集强大的空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(MAlpha(N))的处理下解决了。
模拟镜像
先来三个点1,2,3
创建它们的镜像
操作1 union 1 与 2(本来应该这样)
实际上是这样
这样union 3 与 1,move 2 to another point
就会这样(虚线代表本身的union对象,实线表示路径压缩后的union对象)
move
我们发现了1与3仍在一个集合内(2的镜像5中),只是2指向了X,但以2为父亲的1与3未受其move的印象。
这就是镜像的终极奥义,在虚拟中完成实际的操作(好中二的说。。。。)
欲知后事如何(还有后事?)(废话可持久化还没有实现呢!):
请看下期 可持久化并查集(三)——从动态到可持久化
1 0
- 可持久化并查集(二)——从镜像到动态
- 可持久化并查集(三)——从动态到可持久化
- 可持久化并查集(一)——从阿克曼函数到镜像
- 主席树——BZOJ3673/BZOJ3674 可持久化并查集(加强版)
- 可持久化并查集(外传)——[按秩启发式合并]
- [BZOJ3673]可持久化并查集
- [bzoj3673]可持久化并查集
- 可持久化并查集
- 可持久化并查集
- [BZOJ3674]可持久化并查集加强版(可持久化线段树+并查集)
- BZOJ 3673 可持久化并查集 by zky 可持久化并查集
- BZOJ 3674 可持久化并查集加强版 可持久化并查集
- [BZOJ 3674]可持久化并查集加强版:可持久化并查集
- 【可持久化并查集】BZOJ3674[可持久化并查集加强版]题解
- bzoj3674 可持久化并查集加强版 (主席树 & 并查集)
- BZOJ4537 [Hnoi2016]最小公倍数 (可撤销&&可持久化并查集学习笔记)
- 【BZOJ】【P3673】【可持久化并查集】【题解】
- BZOJ3673 可持久化并查集 by zky
- Cocoapods详解之---进阶篇2
- 基于CMake的JNI开发探索
- 在AE中通过指定中心点和半径画圆
- Vue笔记二:进阶[译]用Webpack构建Vue
- 国外大神说-在编程中使用If语句的潜在危险
- 可持久化并查集(二)——从镜像到动态
- Android Studio将项目打包成apk
- iOS百度地图更新位置
- react-native
- 物联网卡的使用
- 大步小步法解决离散对数问题 by——miskcoo
- 剑指Offer:二维数组中的查找
- centOS目录结构 超详细版
- 第一次上传代码 处女秀-回溯法解决八皇后问题