题解:我们选择用一颗可持久化线段树维护来维护叶子节点的父亲 通过复杂度证明 我们可以知道按秩合并可以将查询根的时间保障在logn的范围内(因为按秩合并的实质是启发式合并 我们可以把深度作为启发量 进行合并保证合并次数只有logn次 从而查询根的复杂度只有logn) 既然和我们可以在logn的复杂度下查找到根 那我们通过可持久线段树维护以后可以在2个log的情况下查询这个点在当前版本内的集合中的根  然后我们就可以维护可持久化并查集 也能返回到其任何历史版本中

/**************************************************************Problem: 3674User: c20161007Language: C++Result: AcceptedTime:1124 msMemory:80204 kb
****************************************************************/#include <bits/stdc++.h>
const int MAXN=2e5+10;
using namespace std;
int n,m,cnt,rt[MAXN],fa,dep,cnt1,k,a,b,op,dep1,dep2,last;
typedef struct node{int l,r,f,dep;
}node;
node d[MAXN*25];
int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return f*x;
}
void built(int &x,int l,int r){if(!x)x=++cnt;if(l==r){d[x].f=l,d[x].dep=1;return ;}int mid=(l+r)>>1;built(d[x].l,l,mid);built(d[x].r,mid+1,r);
}
void update(int &x,int y,int l,int r,int t){x=++cnt;d[x]=d[y];if(l==r){d[x].f=fa;d[x].dep=dep;return ;}int mid=(l+r)>>1;if(t<=mid)update(d[x].l,d[y].l,l,mid,t);else update(d[x].r,d[y].r,mid+1,r,t);
}
int find1(int x,int l,int r,int t){if(l==r)return x;int mid=(l+r)>>1;if(t<=mid)return find1(d[x].l,l,mid,t);else return find1(d[x].r,mid+1,r,t);
}
int _find(int x,int num){while(1){int _t=find1(rt[num],1,n,x);if(d[_t].f==x)return _t;x=d[_t].f;}
}
int res;
int main(){n=read();m=read();built(rt[0],1,n);res=0;for(int i=1;i<=m;i++){op=read();if(op==1){a=read();b=read();rt[i]=rt[i-1];a=a^res;b=b^res;a=_find(a,i);dep1=d[a].dep;b=_find(b,i);dep2=d[b].dep;if(a==b)continue;if(dep1>dep2)fa=d[a].f,dep=0,update(rt[i],rt[i],1,n,d[b].f);else if(dep1<dep2)fa=d[b].f,dep=0,update(rt[i],rt[i],1,n,d[a].f);else fa=d[a].f,dep=0,update(rt[i],rt[i],1,n,d[b].f),fa=d[a].f,dep=dep1+1,update(rt[i],rt[i],1,n,d[a].f);}else if(op==2)k=read(),k=res^k,rt[i]=rt[k];else{a=read();b=read();a=res^a;b=res^b;rt[i]=rt[i-1];a=_find(a,i);b=_find(b,i);if(a==b)res=1;else res=0;printf("%d\n",res);}}return 0;
}

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

Time Limit: 15 Sec  Memory Limit: 256 MB
Submit: 5025  Solved: 1887
[Submit][Status][Discuss]

Description

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

n个集合 m个操作
操作:
1 a b 合并a,b所在集合
2 k 回到第k次操作之后的状态(查询算作操作)
3 a b 询问a,b是否属于同一集合,是则输出1否则输出0
请注意本题采用强制在线,所给的a,b,k均经过加密,加密方法为x = x xor lastans,lastans的初始值为0
0<n,m<=2*10^5

Input

Output

Sample Input

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

Sample Output

1
0
1

HINT

Source

出题人大SB++

转载于:https://www.cnblogs.com/wang9897/p/9426427.html

BZOJ3674: 可持久化并查集加强版相关推荐

  1. bzoj 36733674 可持久化并查集加强版(可持久化线段树+启发式合并)

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

  2. [bzoj3673/3674可持久化并查集加强版]

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

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

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

  4. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...

    1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...

  5. BZOJ5415:[NOI2018]归程(可持久化并查集,最短路)

    Description Input Output Sample Input1 1 4 3 1 2 50 1 2 3 100 2 3 4 50 1 5 0 2 3 0 2 1 4 1 3 1 3 2 S ...

  6. BZOJ 3673: 可持久化并查集 by zky

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

  7. 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]

    题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...

  8. 可持久化4--可持久化并查集

    可持久化并查集 可持久化并查集 = 按秩合并并查集 + 可持久化数组 首先并查集不能采用路径压缩,这是因为一次findR操作中,fa数组的很多位置(u->ru)会发生修改,由于每次修改都需要在可 ...

  9. 可持久化线段树【主席树】可持久化并查集【主席树+并查集】

    笼统的主席树原理 众所周知, 主席树是可以持久化的, 换言之你能知道你所维护信息的所有历史状态. 主席树是这样做的: 1. 首先建一颗朴素的线段树,代表初始状态 (下图黑色) , 也就是第0次操作后的 ...

  10. [NOI2018] 归程 可持久化并查集

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个n 个节点.m 条边的无向连通图(节点的编号从 1至 n).我们依次用 l,a描述一条边的长度.海拔. ...

最新文章

  1. *45.程序的装入方式
  2. sharepoint2010网站根据权限隐藏ribbon
  3. 【MPI学习3】MPI并行程序设计模式:不同通信模式MPI并行程序的设计
  4. 推荐系统常用评价指标和代码实现
  5. 3种团队分组适应项目_业务团队怎样做目标管理?更能激励员工?(附实操方法)...
  6. C语言除法浮点型和整形,浅谈C语言整型与浮点型转换
  7. 如何生成一副Poker
  8. 临时表和游标的使用小总结
  9. 基于 CODING 的 Spring Boot 持续集成项目 1
  10. 时间序列的分析和预测ARIMA
  11. typora快捷键使用
  12. 苹果电脑教程之退出ID账号
  13. 用户提交job后,abaqus的inp文件处理过程
  14. 微信小程序 如何实现列表
  15. vmware不支持linux,vmware不支持opengl
  16. 变量名与变量地址的关系:
  17. html实现相册效果,图片播放(相册效果) - CSS实现
  18. 基于FPGA的VGA时序控制器
  19. IPFS(三)源码解读之-add
  20. Cyclone V LAB ALM结构

热门文章

  1. 在开发时选择静态方法还是非静态方法
  2. Linux系统编程—— fork() 函数详解
  3. Spring之获得Bean本身的id
  4. [渝粤教育] 江西理工大学 新融合大学英语(I) 参考 资料
  5. 【渝粤教育】国家开放大学2018年秋季 1189T政府经济学 参考试题
  6. 等效低通信号=带通信号的复包络
  7. 字符串未被识别为有效的布尔值
  8. Numpy系列(六)常用的数组合并操作
  9. 连续型随机变量量函数的期望
  10. C语言复习---输出魔方阵