思路:

用主席树维护并查集森林,每次连接时新增结点。
似乎并不需要启发式合并,我随随便便写了一个就跑到了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. FarBox--另类有趣的网站服务【转】

    FarBox--另类有趣的网站服务 转自:http://mosir.org/html/y2012/the-interesting-web-service-serve-by-FarBox.html 作者 ...

  2. Windows10 + Visual Studio 2017 + CMake +OpenCV编译、开发环境配置及测试

    由于最近需要使用OpenCV,本人需要在自己的PC上使用OpenCV,因此最近一直在研究如何使用Visual Studio编译OpenCV源代码并搭建开发环境,折腾了很长时间,查阅了很多相关资料,终于 ...

  3. R-TREE

    原文地址:http://blog.csdn.net/sunmenggmail/article/details/8122743 1984年,加州大学伯克利分校的Guttman发表了一篇题为“R-tree ...

  4. git安装及基础用法

    1.安装GitGit-2.9.3-64-bit.exe 2.打开Git Bash,设置用户名,Email $ git config --global user.name "Your Name ...

  5. bzoj 1803: Spoj1487 Query on a tree III(主席树)

    题意 你被给定一棵带点权的n个点的有根数,点从1到n编号. 定义查询 query(x,k): 寻找以x为根的k大点的编号(从小到大排序第k个点) 假设没有两个相同的点权. 输入格式: 第一行为整数n, ...

  6. 几种常用的Interpolator(插值器)的动画效果

    在实现动画的非线性变化的方法中,常用的一种是为动画添加插值器以改变视图的属性值,从而实现理想的动画效果.Interpolator使用相对简单,下面就只给出一些提供的插值器的默认效果. 在代码中:直接调 ...

  7. laravel migrate 指定执行部分 migration

    由于我不习惯于使用 laravel migration 来管理数据表变更,所以很多项目都是无法直接执行 php artisan migrate 否则会报错 SQLSTATE[42S01]: Base ...

  8. 步步为营-22-xml登录

    说明:通过xml完成用户登录信息的判断 1 搭建UI页面 2 新建一个student类,类中包含以上属性 public class Student { public int ID { get; set ...

  9. 《转》CXF WebService 开发文档-目录索引

    CXF WebService 开发文档-目录索引 上次介绍了Axis的WebService,现在我们来看看CXF是怎么完成WebService的. Axis1 WebService 在线博文: htt ...

  10. Android各国语言对照表(values-xxx)

    eg: 阿拉伯 Arabic  SA values-ar Android各国语言对照表https://blog.csdn.net/jiangguohu1/article/details/5044014 ...