http://www.lydsy.com/JudgeOnline/problem.php?id=3674 (题目链接)

题意

  维护并查集3个操作:合并;回到完成第k个操作后的状态;查询。

Solution

  其实就是用主席树的叶子节点维护并查集的可持久化数组fa[]。

细节

  终于认识到了按秩合并的强大,单纯写个路径压缩Re飞,写了路径压缩+按秩合并比单纯的按秩合并没快多少→_→

代码

  1. // bzoj3674
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<cstdio>
  7. #include<cmath>
  8. #define LL long long
  9. #define inf 2147483640
  10. #define Pi acos(-1.0)
  11. #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  12. using namespace std;
  13.  
  14. const int maxn=200010,maxm=10000010;
  15. struct tree {int ls,rs;}tr[maxm];
  16. int fa[maxm],deep[maxm],rt[maxn],n,m,sz;
  17.  
  18. void build(int &k,int l,int r) {
  19. if (!k) k=++sz;
  20. if (l==r) {fa[k]=l;return;}
  21. int mid=(l+r)>>1;
  22. build(tr[k].ls,l,mid);
  23. build(tr[k].rs,mid+1,r);
  24. }
  25. void update(int &k1,int k2,int l,int r,int x,int val) {
  26. k1=++sz;tr[k1]=tr[k2];
  27. int mid=(l+r)>>1;
  28. if (l==r) {fa[k1]=val,deep[k1]=deep[k2];return;}
  29. if (x<=mid) update(tr[k1].ls,tr[k2].ls,l,mid,x,val);
  30. else update(tr[k1].rs,tr[k2].rs,mid+1,r,x,val);
  31. }
  32. void add(int k,int l,int r,int x) {
  33. if (l==r) {deep[k]++;return;}
  34. int mid=(l+r)>>1;
  35. if (x<=mid) add(tr[k].ls,l,mid,x);
  36. else add(tr[k].rs,mid+1,r,x);
  37. }
  38. int query(int k,int l,int r,int x) {
  39. int mid=(l+r)>>1;
  40. if (l==r) return k;
  41. if (x<=mid) return query(tr[k].ls,l,mid,x);
  42. else return query(tr[k].rs,mid+1,r,x);
  43. }
  44. int find(int k,int x) {
  45. int p=query(k,1,n,x);
  46. if (x==fa[p]) return p;
  47. int t=find(k,fa[p]);
  48. update(k,k,1,n,fa[p],fa[t]);
  49. return t;
  50. }
  51. int main() {
  52. scanf("%d%d",&n,&m);
  53. build(rt[0],1,n);
  54. int ans=0;
  55. for (int op,a,b,i=1;i<=m;i++) {
  56. scanf("%d",&op);
  57. if (op==1) {
  58. rt[i]=rt[i-1];
  59. scanf("%d%d",&a,&b);a^=ans,b^=ans;
  60. int r1=find(rt[i],a),r2=find(rt[i],b);
  61. if (fa[r1]==fa[r2]) continue;
  62. //if (deep[r1]>deep[r2]) swap(r1,r2);
  63. update(rt[i],rt[i-1],1,n,fa[r1],fa[r2]);
  64. //if (deep[r1]==deep[r2]) add(rt[i],1,n,fa[r2]);
  65. }
  66. if (op==2) {scanf("%d",&a);a^=ans;rt[i]=rt[a];}
  67. if (op==3) {
  68. rt[i]=rt[i-1];
  69. scanf("%d%d",&a,&b);
  70. a^=ans,b^=ans;
  71. int r1=find(rt[i],a),r2=find(rt[i],b);
  72. ans=fa[r1]==fa[r2] ? 1 : 0;
  73. printf("%d\n",ans);
  74. }
  75. }
  76. return 0;
  77. }

  

【bzoj3674】 可持久化并查集加强版的更多相关文章

  1. bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版

    bzoj3673可持久化并查集 by zky 题意: 维护可以恢复到第k次操作后的并查集. 题解: 用可持久化线段树维护并查集的fa数组和秩(在并查集里的深度),不能路径压缩所以用按秩启发式合并,可以 ...

  2. BZOJ3674: 可持久化并查集加强版

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3674 题解:主要是可持久化的思想.膜拜了一下hzwer的代码后懂了. 其实本质是可持久化fa数 ...

  3. 2019.01.21 bzoj3674: 可持久化并查集加强版(主席树+并查集)

    传送门 题意:维护可持久化并查集,支持在某个版本连边,回到某个版本,在某个版本 询问连通性. 思路: 我们用主席树维护并查集fafafa数组,由于要查询历史版本,因此不能够用路径压缩. 可以考虑另外一 ...

  4. [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky

    思路: 用主席树维护并查集森林,每次连接时新增结点. 似乎并不需要启发式合并,我随随便便写了一个就跑到了3674第一页?3673是这题的弱化版,本来写个暴力就能过,现在借用加强版的代码(去掉异或),直 ...

  5. BZOJ3674 可持久化并查集加强版 可持久化 并查集

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3674 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...

  6. 【BZOJ3673/3674】可持久化并查集/可持久化并查集加强版 可持久化线段树

    [BZOJ3674]可持久化并查集加强版 Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了! ...

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

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

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

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

  9. 【BZOJ3674】可持久化并查集加强版

    可持久化并查集我觉得就是可持久化数组的一种应用.可持久化数组,顾名思义,就是有历史版本的数组,那么如果我们暴力修改储存的话,修改O(n)查询O(1),空间O(n*m),这样肯定不可行,那么我们发现主席 ...

  10. bzoj3674 可持久化并查集

    我是萌萌的任意门 可持久化并查集的模板题-- 做法好像很多,可以标号法,可以森林法. 本来有O(mloglogn)的神算法(按秩合并+倍增),然而我这种鶸渣就只会写O(mlog2n)的民科算法--再加 ...

随机推荐

  1. P1047 校门外的树

    P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...

  2. .NET MVC控制器分离到类库的方法

    在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...

  3. css 内容超过容器宽度,checkbox等控件不会随着内容延伸

    <div a> <div id='内容容器'> <div>很长的内容</div><input type='checkbox'/> </ ...

  4. Qt5 新特性

    Qt 5 已经临近发布,其最大的特点就是模块化.将原来庞大的模块更细分为不同的部分,同时,一个大版本的升级,当然少不了添加.删除各个功能类.文本简单介绍 Qt5 的特性,其具体内容来自 Qt5 官方 ...

  5. C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  6. IIS安装与MVC程序部署

    最近在做访客系统,虽然说不是什么多大的项目,但麻雀虽小五脏俱全,使用EF Code First+Mysql+Frozenui响应式布局,感觉通过这个项目学到好多东西,Mysql的使用.EF映射Mysq ...

  7. 怎样修改 Openstack Horizon(Dashboard)的显示界面 (一)

    Openstack 有很多项目,比如 nova 是虚拟机管理,neutron 是虚拟网络管理, glance 是存储管理,而 horizon 是负责 Openstack 的统一界面.horizon 的 ...

  8. TortoiseSVN安装使用(转)

    TortoiseSVN是windows平台下Subversion的免费开源客户端. 一般我们都是先讲讲服务器的配置,然后再讲客户端的使用,但是在TortoiseSVN上,却可以反过来.因为,如果你的要 ...

  9. [BZOJ2257][Jsoi2009]瓶子和燃料(数学)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2257 分析: 1.先考虑确定的瓶子下的最小体积是多少 ①假设只有两个瓶子v1,v2,易 ...

  10. 无线AP和无线路由器区别

    无线AP,即Access Point,也就是无线接入点.简单来说就是wifi共享上网中的无线交换机,它是移动终端用户进入有线网络的接入点. AD:51CTO技术沙龙 | 赋予APP不同凡响的交互和体验 ...