可持久化并查集我觉得就是可持久化数组的一种应用。可持久化数组,顾名思义,就是有历史版本的数组,那么如果我们暴力修改储存的话,修改O(n)查询O(1),空间O(n*m),这样肯定不可行,那么我们发现主席树有这样的功能,他可以快速复制,修改O(log),查询O(log),空间(m*log),是一个可行的方案。然后我们可持久化f数组维护fa,每次按照深度启发式合并,不进行路径压缩,这样能保证时间复杂度位单次O(log^2),空间复杂度为O(2*n+m*log)。我不知道为什么不路径压缩,路径压缩是完全可以的,但是他的时间复杂度和空间复杂度似乎都不如不路径压缩看,而且似乎并不好打。

#include <cstdio>
using namespace std;
inline void read(int &sum){
register char ch=getchar();
for(sum=;ch<''||ch>'';ch=getchar());
for(;ch>=''&&ch<='';sum=(sum<<)+(sum<<)+ch-'',ch=getchar());
}
const int N=;
struct Segment_Tree{
Segment_Tree *ch[];int f,deep;
void* operator new(size_t);
}*root[N],*null,*C,*mempool;
int n,m;
void* Segment_Tree :: operator new(size_t){
if(C==mempool)C=new Segment_Tree[(<<)+],mempool=C+(<<)+;
return C++;
}
inline void build(Segment_Tree *&p,int l,int r){
p=new Segment_Tree,p->deep=p->f=;
if(l==r){
p->f=l,p->deep=,p->ch[]=p->ch[]=null;
return;
}
build(p->ch[],l,(l+r)>>);
build(p->ch[],((l+r)>>)+,r);
}
inline void insert(Segment_Tree *&p,Segment_Tree *last,int pos,int key,int l,int r){
p=new Segment_Tree,*p=*last;
if(l==r){
p->f=key;return;
}
if(pos<=((l+r)>>))insert(p->ch[],last->ch[],pos,key,l,((l+r)>>));
else insert(p->ch[],last->ch[],pos,key,((l+r)>>)+,r);
}
inline void update(Segment_Tree *p,int pos){
register int l=,r=n;
while(l!=r){
if(pos<=((l+r)>>)){
p=p->ch[],r=((l+r)>>);
}else{
p=p->ch[],l=((l+r)>>)+;
}
}
p->deep++;
}
inline int deep(Segment_Tree *p,int pos){
register int l=,r=n;
while(l!=r){
if(pos<=((l+r)>>)){
p=p->ch[],r=((l+r)>>);
}else{
p=p->ch[],l=((l+r)>>)+;
}
}
return p->deep;
}
inline int F(Segment_Tree *p,int pos){
register int l=,r=n;
while(l!=r){
if(pos<=((l+r)>>)){
p=p->ch[],r=((l+r)>>);
}else{
p=p->ch[],l=((l+r)>>)+;
}
}
return p->f;
}
inline int find_root(Segment_Tree *p,int x){
int fa=F(p,x);
return fa==x?x:find_root(p,fa);
}
inline void Init(){
null=new Segment_Tree,null->ch[]=null->ch[]=null,null->f=,null->deep=;
read(n),read(m);
build(root[],,n);
}
inline void Work(){
register int ans=,opt,a,b,x,y,d1,d2;
for(register int i=;i<=m;i++){
read(opt);
switch(opt){
case :read(a),a^=ans,read(b),b^=ans;
x=find_root(root[i-],a),y=find_root(root[i-],b);
if(x==y){
root[i]=root[i-];
break;
}
d1=deep(root[i-],x),d2=deep(root[i-],y);
if(d1>d2)x^=y^=x^=y;insert(root[i],root[i-],x,y,,n);
if(d1==d2)update(root[i],y);
break;
case :read(a),a^=ans;
root[i]=root[a];break;
case :read(a),read(b),a^=ans,b^=ans;
root[i]=root[i-];
x=find_root(root[i],a),y=find_root(root[i],b);
if(x==y)puts(""),ans=;
else puts(""),ans=;
break;
}
}
}
int main(){
Init();
Work();
return ;
}

【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(mloglogn)的神算法(按秩合并+倍增),然而我这种鶸渣就只会写O(mlog2n)的民科算法--再加 ...

随机推荐

  1. thinkphp-PHP实现pdf导出功能

    Thinkphp框架引用tcpdf插件,插件下载地址:待续... 代码编写前先引入tcpdf整个文件夹到项目目录的ThinkPHP文件夹下 如:/ThinkPHP/Library/Vendor/tcp ...

  2. 洛谷 U45568 赌神:决斗

    题目描述 \mathcal{tomoo}tomoo决定与\mathcal{CYJian}CYJian进行决斗! 已知\mathcal{tomoo}tomoo有\mathcal{N}N张扑克牌,每张扑克 ...

  3. PADS快捷键

    问:在pads layout中怎样显示或隐藏铺铜的效果 答: 无模命令:po 或者spo 前者是平面层 后者是混合层. 同时你可以在ctrl+alt+c 色彩项中关闭 copper . 使用 无模命令 ...

  4. (译)JavaScript 中的正则表达式(RegEx)实操——快速掌握正则表达式,伴有随手可练的例子————(翻译未完待续)

    (原文:https://blog.bitsrc.io/a-beginners-guide-to-regular-expressions-regex-in-javascript-9c58feb27eb4 ...

  5. 杭电 1003 Max Sum (动态规划)

    参考:https://www.cnblogs.com/yexiaozi/p/5749338.html #include <iostream> #include <cstdio> ...

  6. @Transactional spring 事务失效(转载)

    原文地址:http://hwak.iteye.com/blog/1611970 1. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和 ...

  7. xss挑战赛小记 0x02(prompt(1))

    0x0O 上次搜xss挑战赛的时候 还找到了一个看上去难度更高的挑战赛 今天做了一下 学到了很多新东西 这个挑战赛能够在页面成功prompt(1)就算过关了 挑战地址 http://prompt.ml ...

  8. P1196 银河英雄传说(加权并查集)

    P1196 银河英雄传说 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在 ...

  9. lessJs

    lessJs下载地址 ======== 简介 lessJs主要提供页面切换,页面管理的一个框架:less-ui.css 和 less-ui.js 是独立于less.js的,他们提供的是一组ui,包括消 ...

  10. 在PXC中重新添加掉线节点

      Preface       When we add a new node into PXC structure,it will estimate the mothed(IST/SST) to tr ...