题解

感觉全世界都写过只有我没写过

毕竟是板子还是挺简单的,只要用可持久化线段树维护一下数组的形态就好了,每个数组里面维护这个数组的father,和这个点所在树的最长链的深度(如果这个点是根按秩合并要用)

为了避免返回两个值可以直接返回所在线段树节点的编号

代码

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <vector>
  6. #include <set>
  7. #include <cmath>
  8. #include <bitset>
  9. #define enter putchar('\n')
  10. #define space putchar(' ')
  11. //#define ivorysi
  12. #define pb push_back
  13. #define mo 974711
  14. #define pii pair<int,int>
  15. #define mp make_pair
  16. #define fi first
  17. #define se second
  18. #define MAXN 200005
  19. using namespace std;
  20. typedef long long int64;
  21. typedef double db;
  22. template<class T>
  23. void read(T &res) {
  24. res = 0;char c = getchar();T f = 1;
  25. while(c < '0' || c > '9') {
  26. if(c == '-') f = -1;
  27. c = getchar();
  28. }
  29. while(c >= '0' && c <= '9') {
  30. res = res * 10 - '0' + c;
  31. c = getchar();
  32. }
  33. res = res * f;
  34. }
  35. template<class T>
  36. void out(T x) {
  37. if(x < 0) {x = -x;putchar('-');}
  38. if(x >= 10) out(x / 10);
  39. putchar('0' + x % 10);
  40. }
  41. int N,M;
  42. struct node {
  43. int f,dep,lc,rc;
  44. }tr[MAXN * 80];
  45. int rt[MAXN],Ncnt;
  46. void build(int &u,int l,int r) {
  47. u = ++Ncnt;
  48. if(l == r) {
  49. tr[u].f = l;
  50. tr[u].dep = 1;
  51. return;
  52. }
  53. int mid = (l + r) >> 1;
  54. build(tr[u].lc,l,mid);
  55. build(tr[u].rc,mid + 1,r);
  56. }
  57. int Query(int u,int L,int R,int pos) {
  58. if(L == R) return u;
  59. int mid = (L + R) >> 1;
  60. if(pos <= mid) return Query(tr[u].lc,L,mid,pos);
  61. else return Query(tr[u].rc,mid + 1,R,pos);
  62. }
  63. void Change(int x,int &y,int L,int R,int pos,int v) {
  64. y = ++Ncnt;
  65. tr[y] = tr[x];
  66. if(L == R) {tr[y].f = v;return;}
  67. int mid = (L + R) >> 1;
  68. if(pos <= mid) Change(tr[x].lc,tr[y].lc,L,mid,pos,v);
  69. else Change(tr[x].rc,tr[y].rc,mid + 1,R,pos,v);
  70. }
  71. void Inc_dep(int x,int &y,int L,int R,int pos) {
  72. y = ++Ncnt;
  73. tr[y] = tr[x];
  74. if(L == R) {tr[y].dep++;return;}
  75. int mid = (L + R) >> 1;
  76. if(pos <= mid) Inc_dep(tr[x].lc,tr[y].lc,L,mid,pos);
  77. else Inc_dep(tr[x].rc,tr[y].rc,mid + 1,R,pos);
  78. }
  79. int getfa(int u,int x) {
  80. int p = Query(u,1,N,x);
  81. if(tr[p].f == x) return p;
  82. else return getfa(u,tr[p].f);
  83. }
  84. void Solve() {
  85. read(N);read(M);
  86. build(rt[0],1,N);
  87. int op,a,b;
  88. for(int i = 1 ; i <= M ; ++i) {
  89. read(op);
  90. if(op == 1) {
  91. rt[i] = rt[i - 1];
  92. read(a);read(b);
  93. a = getfa(rt[i],a);b = getfa(rt[i],b);
  94. if(a == b) continue;
  95. if(tr[a].dep < tr[b].dep) Change(rt[i],rt[i],1,N,tr[a].f,tr[b].f);
  96. else if(tr[b].dep < tr[a].dep) Change(rt[i],rt[i],1,N,tr[b].f,tr[a].f);
  97. else {
  98. Change(rt[i],rt[i],1,N,tr[a].f,tr[b].f);
  99. Inc_dep(rt[i],rt[i],1,N,tr[b].f);
  100. }
  101. }
  102. else if(op == 2) {
  103. read(a);
  104. rt[i] = rt[a];
  105. }
  106. else if(op == 3) {
  107. rt[i] = rt[i - 1];
  108. read(a);read(b);
  109. a = getfa(rt[i],a);b = getfa(rt[i],b);
  110. if(a == b) {puts("1");}
  111. else puts("0");
  112. }
  113. }
  114. }
  115. int main() {
  116. #ifdef ivorysi
  117. freopen("f1.in","r",stdin);
  118. #endif
  119. Solve();
  120. }

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

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

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

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

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

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

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

  4. bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)

    Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...

  5. BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树

    既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...

  6. bzoj 3674 可持久化并查集加强版——可持久化并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3674 用主席树维护 fa[ ]  和 siz[ ] .改 fa[ ] 和改 siz[ ] 都 ...

  7. BZOJ 3674: 可持久化并查集加强版

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3674 题意:三种操作:(1)合并ab所在集合:(2)查询ab是否在一个集合:(3) ...

  8. BZOJ 3674 可持久化并查集加强版 可持久化并查集

    题目大意:同3673 强制在线 同3673 仅仅只是慢了一些0.0 这道题仅仅写路径压缩比仅仅写启示式合并要快一点点 两个都写就慢的要死0.0 改代码RE的可能是内存不够 #include<cs ...

  9. 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id ...

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

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

随机推荐

  1. Shell记录-Shell命令(磁盘)

    inux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式 df [选项] [文件] Shell ...

  2. Flash数据的采集方法-搜房房价走势采集

    一般来说flash中的数据是不能被现有技术很容易采集到的,但是也不能谈flash色变,要具体问题具体分析,有些flash是可以通过一些分析发现背后的数据.然后采集就变得很容易了. 具体案例:搜房房价走 ...

  3. python json dumps loads

    请看以上图片可知 1. python requests里面返回的是json 字符串, 说白了是字符串.不能直接取里面对应的值. 2. 取值的话,需要把json字符串转换成字典, 用json.loads ...

  4. 微信小程序开发教程(七)逻辑层——.js详解

    逻辑层,是事务逻辑处理的地方.对于小程序而言,逻辑层就是.js脚本文件的集合.逻辑层将数据进行处理后发送给视图层,同时接收视图层的事件反馈. 微信小程序开发框架的逻辑层是由JavaScript编写.在 ...

  5. layui-laypage模块代码详解

    /** layui-v2.4.0 MIT License By https://www.layui.com */;layui.define(function(e) { "use strict ...

  6. 关于onConfigurationChanged

    这两天测试app时,发现一个奇怪问题,app在启动后,Activity会onCreate两次,起初以为是横屏设置导致,随即在Activity中添加了android:configChanges=&quo ...

  7. 20155303 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155303 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一(新建文件夹): ...

  8. jquery easyui 扩展验证

    $.extend($.fn.validatebox.defaults.rules, {  idcard : {// 验证身份证          validator : function(value) ...

  9. C# 反射获取和设置值

    /// <summary> /// 遍历泛型 /// </summary> /// <typeparam name="T"></typep ...

  10. MVC中检测到有潜在危险的 Request.Form 值

    在做mvc项目时,当使用xhedit or.ueditor编辑器时,点击提交时,编辑器中的内容会带有html标签提交给服务器,这时就是会报错,出现如下内容: “/”应用程序中的服务器错误. 从客户端( ...