Description

n个集合 m个操作
操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0

0<n,m<=2*10^4

Input

Output

Sample Input

5 6
1 1 2
3 1 2
2 0
3 1 2
2 1
3 1 2

Sample Output

1
0
1

题解:

首先普通并查集操作中,是靠fa这个数组维护的

所以要可持久并查集,就要可持久化fa数组,所以用到可持久化线段树维护.

注意要路径压缩

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cstdio>
  6. #include <cmath>
  7. #define RG register
  8. #define il inline
  9. using namespace std;
  10. const int N=,M=;
  11. int gi(){
  12. int str=;char ch=getchar();
  13. while(ch>'' || ch<'')ch=getchar();
  14. while(ch>='' && ch<='')str=(str<<)+(str<<)+ch-,ch=getchar();
  15. return str;
  16. }
  17. int n,m,tot=,root[M];
  18. struct node{
  19. int ls,rs,fa;
  20. }t[N];
  21. il void build(int &rt,int l,int r){
  22. rt=++tot;
  23. if(l==r){
  24. t[rt].fa=l;
  25. return ;
  26. }
  27. int mid=(l+r)>>;
  28. build(t[rt].ls,l,mid);build(t[rt].rs,mid+,r);
  29. }
  30. il int query(int rt,int l,int r,int sa){
  31. if(l==r)
  32. return rt;
  33. int mid=(l+r)>>;
  34. if(sa>mid)return query(t[rt].rs,mid+,r,sa);
  35. else return query(t[rt].ls,l,mid,sa);
  36. }
  37. il void updata(int &rt,int last,int l,int r,int sa,int to){
  38. rt=++tot;t[rt]=t[last];
  39. if(l==r){
  40. t[rt].fa=to;
  41. return ;
  42. }
  43. int mid=(l+r)>>;
  44. if(sa>mid)updata(t[rt].rs,t[last].rs,mid+,r,sa,to);
  45. else updata(t[rt].ls,t[last].ls,l,mid,sa,to);
  46. }
  47. il int find(int x,int i){
  48. int c=query(root[i],,n,x);
  49. if(t[c].fa==x)return x;
  50. int d=find(t[c].fa,i);
  51. updata(root[i],root[i],,n,x,d);
  52. return d;
  53. }
  54. void work()
  55. {
  56. int flag,x,y,fx,fy;
  57. n=gi();m=gi();
  58. build(root[],,n);
  59. for(int i=;i<=m;i++){
  60. flag=gi();x=gi();
  61. if(flag==){
  62. y=gi();
  63. root[i]=root[i-];
  64. fx=find(x,i);fy=find(y,i);
  65. if(fx==fy)continue;
  66. updata(root[i],root[i-],,n,fx,fy);
  67. }
  68. else if(flag==)root[i]=root[x];
  69. else{
  70. y=gi();
  71. root[i]=root[i-];
  72. fx=find(x,i);fy=find(y,i);
  73. if(fx==fy)puts("");
  74. else puts("");
  75. }
  76. }
  77. }
  78.  
  79. int main()
  80. {
  81. work();
  82. return ;
  83. }

bzoj 3673&3674: 可持久化并查集 by zky的更多相关文章

  1. 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之

    最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...

  2. bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)

    CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...

  3. [bzoj] 3673 3674 可持久化并查集 || 可持久化数组

    原题 加强版 题意: 可持久化并查集模板-- 题解: 用可持久化线段树维护一个可持久化数组,来记录每一次操作后的状态. 不能用路径压缩,但是要按置合并,使复杂度保证在O(log) #include&l ...

  4. BZOJ.3673/3674.可持久化并查集(可持久化线段树 按秩合并/启发式合并)

    BZOJ 3673 BZOJ 3674(加强版) 如果每次操作最多只修改一个点的fa[],那么我们可以借助可持久化线段树来O(logn)做到.如果不考虑找fa[]的过程,时空复杂度都是O(logn). ...

  5. 【BZOJ】3674: 可持久化并查集加强版

    题解 感觉全世界都写过只有我没写过 毕竟是板子还是挺简单的,只要用可持久化线段树维护一下数组的形态就好了,每个数组里面维护这个数组的father,和这个点所在树的最长链的深度(如果这个点是根按秩合并要 ...

  6. 【BZOJ】【3673】可持久化并查集 & 【3674】可持久化并查集加强版

    可持久化并查集 Orz hzwer & zyf 呃学习了一下可持久化并查集的姿势……其实并查集就是一个fa数组(可能还要带一个size或rank数组),那么我们对并查集可持久化其实就是实现一个 ...

  7. BZOJ 3674 可持久化并查集加强版(主席树变形)

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 2515  Solved: 1107 [Submit][Sta ...

  8. BZOJ 3674 可持久化并查集加强版(路径压缩版本)

    /* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...

  9. BZOJ 3674 可持久化并查集加强版(按秩合并版本)

    /* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...

随机推荐

  1. python的Virtualenv

    Virtualenv 虚拟的 Python 环境(简称 venv) 是一个能帮助你在本地目录安装不同版本的 Python 模块的 Python 环境,你可以不再需要在你系统中安装所有东西就能开发并测试 ...

  2. Flask学习 一 基本结构

    -from flask import Flask +from flask import Flask,render_template -from flask import request -from f ...

  3. Mysql 相关操作

    1.用户管理 创建用户 create user '用户名'@'IP地址' identified by '密码'; 删除用户 drop user '用户名'@'IP地址'; 修改用户 rename us ...

  4. RxSwift:ReactiveX for Swift 翻译

    RxSwift:ReactiveX for Swift 翻译 字数1787 阅读269 评论3 喜欢3 图片发自简书App RxSwift | |-LICENSE.md |-README.md |-R ...

  5. stringify 字符串转化成json方法

    参照原文:http://www.cnblogs.com/damonlan/ http://www.jb51.net/article/29893.htm stringify的作用主要是序列化对象(转化为 ...

  6. NFS PersistentVolume - 每天5分钟玩转 Docker 容器技术(151)

    上一节我们介绍了 PV 和 PVC,本节通过 NFS 实践. 作为准备工作,我们已经在 k8s-master 节点上搭建了一个 NFS 服务器,目录为 /nfsdata: 下面创建一个 PV mypv ...

  7. Linq 大合集

    static void Main(string[] args) { string[] words = { "zero", "one", "two&qu ...

  8. SpringBoot应用的监控与管理

    spring-boot-starter-actuator模块 /health /autoconfig /beans /configprops:应用配置属性信息 /env:环境属性,如:环境变量.jvm ...

  9. hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(2)安装hadoop

    一.依赖安装 安装JDK 二.文件准备 hadoop-2.7.3.tar.gz 2.2 下载地址 http://hadoop.apache.org/releases.html 三.工具准备 3.1 X ...

  10. 英语词汇周计划(1-1)group 1

    abandon 1.He abandoned his wife and ten-year-old daughter. 2.abandon oneself to do sth 3.with abando ...