思路:

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

 #include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=,SIZE=;
class PresistentDisjointSet {
private:
unsigned int left[SIZE],right[SIZE],sz;
int anc[SIZE];
unsigned int newnode() {
return sz++;
}
unsigned int getpos(const unsigned int p,const int b,const int e,const int x) {
if(b==e) return p;
int mid=(b+e)>>;
return (x<=mid)?getpos(left[p],b,mid,x):getpos(right[p],mid+,e,x);
}
public:
unsigned int root[N];
PresistentDisjointSet() {
sz=;
}
void Build(unsigned int &p,const int b,const int e) {
p=newnode();
if(b==e) {
anc[p]=b;
return;
}
int mid=(b+e)>>;
Build(left[p],b,mid);
Build(right[p],mid+,e);
}
unsigned int find(const unsigned int p,const int b,const int e,const int x) {
int q=getpos(p,b,e,x);
return x==anc[q]?q:find(p,b,e,anc[q]);
}
unsigned int Union2(const unsigned int p,const int b,const int e,const int x,const int y) {
unsigned int new_p=newnode();
if(b==e) {
anc[new_p]=y;
return new_p;
}
int mid=(b+e)>>;
if(x<=mid) left[new_p]=Union2(left[p],b,mid,x,y),right[new_p]=right[p];
if(x>mid) right[new_p]=Union2(right[p],mid+,e,x,y),left[new_p]=left[p];
return new_p;
}
bool isConnected(const int x,const int y) {
return anc[x]==anc[y];
}
unsigned int Union(const unsigned int p,const int b,const int e,int x,int y) {
x=find(p,b,e,x),y=find(p,b,e,y);
if(isConnected(x,y)) return p;
return Union2(p,b,e,anc[x],anc[y]);
}
};
PresistentDisjointSet s;
int main() {
int n=getint(),lastans=;
s.Build(s.root[],,n);
int m=getint();
for(register int i=;i<=m;i++) {
int op=getint();
if(op==) s.root[i]=s.Union(s.root[i-],,n,getint()^lastans,getint()^lastans);
else if(op==) s.root[i]=s.root[getint()^lastans];
else s.root[i]=s.root[i-],printf("%d\n",lastans=s.isConnected(s.find(s.root[i],,n,getint()^lastans),s.find(s.root[i],,n,getint()^lastans)));
}
return ;
}

[BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [BZOJ3673&3674]可持久化并查集&加强版

    题目大意:让你实现一个可持久化的并查集(3674强制在线). 解题思路:刚刚介绍了一个叫rope的神器:我是刘邦,在这两题(实际上两题没什么区别)就派上用场了. 正解应该是主席树||可持久化平衡树,然 ...

  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. BZOJ3673 可持久化并查集 by zky 【主席树】

    BZOJ3673 可持久化并查集 by zky Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a ...

随机推荐

  1. C# .NET Winform等程序一运行就闪退 不同环境 换到其他电脑,例如XP之类的解决方法。

    我现在写标题就跟写tag一样,方便大家索引. 有时候经常会把.NET写的程序拿到其他客户机,发现直接闪退,啥也不报错..那就很蛋疼,又不可能去装IDE来检测是吧,网上还有很多说啥看系统日志的,什么图标 ...

  2. as无法在vivo上安装程序解决

    1. vivo手机真的很麻烦,首先要确定vivo账号密码,允许安装后还一直失败.记录下解决方案 在工程目录的gradle.properties中添加android.injected.testOnly ...

  3. MyEclipse 2015反编译插件安装

    本文转自 MyEclipse 2015反编译插件安装 分享一下下载插件的地址,百度网盘:链接:http://pan.baidu.com/s/1nturiAH 密码:yk73 其次:我来说下具体操作步骤 ...

  4. 浏览器的userAgent归纳

    IE IE6 User-Agent:Mozilla/4.0 (Windows; MSIE 6.0; Windows NT 5.2) IE7 User-Agent:Mozilla/4.0 (compat ...

  5. python+selenium+unittest 实现自动化测试

    示例代码: baidu.py import csv #导入csv模块 from itertools import islice #从itertools导入islice,后边让其默认跳过第一行使用 fr ...

  6. easyUI拖动:draggable()方法运用

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>de ...

  7. python 全栈开发,Day10(动态参数,命名空间,作用域,函数嵌套)

    一.动态参数 def func(a,b,c,d,e,f,g): pass func(1,2,3,4,5,6,7) 如果加30个参数呢?有没有万能的参数,可以代表一切参数呢? *args 动态参数,万能 ...

  8. hdu 1372 骑士从起点走到终点的步数 (BFS)

    给出起点和终点 求骑士从起点走到终点所需要的步数 Sample Inpute2 e4 //起点 终点a1 b2b2 c3a1 h8a1 h7h8 a1b1 c3f6 f6 Sample OutputT ...

  9. Json的简单使用

    1>:推荐JSON学习的网址:http://www.w3school.com.cn/json/index.asp 2>:JSON: JavaScript 对象表示法(JavaScript ...

  10. POJ 2229 Sumsets【DP】

    题意:把n拆分为2的幂相加的形式,问有多少种拆分方法. 分析:dp,任何dp一定要注意各个状态来源不能有重复情况.根据奇偶分两种情况,如果n是奇数则与n-1的情况相同.如果n是偶数则还可以分为两种情况 ...