BZOJ 3674 可持久化并查集加强版(路径压缩版本)
/*
bzoj 3674: 可持久化并查集加强版
http://www.lydsy.com/JudgeOnline/problem.php?id=3674
用可持久化线段树维护可持久化数组从而实现可持久化并查集
可持久化线段树+并查集+路径压缩+读入优化
*/
#include <cstdio>
#include <algorithm>
using namespace std;
const int Nmax=;
int root_fa[Nmax]; inline int read()
{
int x=;char ch=getchar();
while(ch>''||ch<'')ch=getchar();
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x;
}
struct Node
{
int ls;
int rs;
int data;
};
Node fa[*Nmax];
int n,m,ans,a,b,k;
int size_fa; void build_fa(int &root,int l,int r)
{
root=size_fa++;
int mid=(l+r)>>;
if(l==r)
{
fa[root].data=l;
return;
}
build_fa(fa[root].ls,l,mid);
build_fa(fa[root].rs,mid+,r);
} void insert_fa(int last,int &root,int pos,int data,int l,int r)
{
fa[size_fa]=fa[last];
root=size_fa;
size_fa++;
if(fa[root].ls==fa[root].rs)
{
// printf("root:%d,l:%d,data:%d\n",root,fa[root].l,data);
fa[root].data=data;
return;
}
int mid=(l+r)>>;
if(pos<=mid)
insert_fa(fa[last].ls,fa[root].ls,pos,data,l,mid);
else
insert_fa(fa[last].rs,fa[root].rs,pos,data,mid+,r);
} int search_fa(int root,int pos,int l,int r)
{
if(fa[root].ls==fa[root].rs)
return fa[root].data;
int mid=(l+r)>>;
if(pos<=mid)
return search_fa(fa[root].ls,pos,l,mid);
else
return search_fa(fa[root].rs,pos,mid+,r);
} int find(int i,int x)
{
// if(x==0)
// printf("error!!!!\n");
int fa=search_fa(root_fa[i],x,,n);
if(fa==x)
return fa;
int t=find(i,fa);
insert_fa(root_fa[i],root_fa[i],fa,t,,n);
return t;
} void watch(int root,int l,int r)
{
if(l==r)
{
printf("fa[%d]=%d\n",l,fa[root].data);
return;
}
int mid=(l+r)>>;
watch(fa[root].ls,l,mid);
watch(fa[root].rs,mid+,r);
} int main()
{
// freopen("bzoj3674.in","r",stdin);
//scanf("%d%d",&n,&m);
n=read();
m=read();
ans=;
int q;
build_fa(root_fa[],,n); // printf("the 0 watch:\n");
// watch(root_fa[0],1,n);
for(int i=;i<=m;i++)
{
//scanf("%d",&q);
q=read();
if(q==)
{
a=read();
b=read();
// scanf("%d%d",&a,&b);
a^=ans;b^=ans;
int rt1=find(i-,a),rt2=find(i-,b);
// printf("root[%d]=%d,root[%d]=%d\n",a,rt1,b,rt2);
if(rt1==rt2)
root_fa[i]=root_fa[i-];
else
insert_fa(root_fa[i-],root_fa[i],rt1,rt2,,n);
// printf("search_fa[2]=%d\n",search_fa(root_fa[1],2) );
// printf("root[%d]=%d,root[%d]=%d\n",a,find(root_fa[i],a),b,find(root_fa[i],b));
}
else if(q==)
{
k=read();
// scanf("%d",&k);
k^=ans;
root_fa[i]=root_fa[k];
}
else if(q==)
{
a=read();
b=read();
// scanf("%d%d",&a,&b);
root_fa[i]=root_fa[i-];
a^=ans;
b^=ans;
if(find(i,a)==find(i,b))
ans=;
else
ans=;
printf("%d\n",ans);
}
//insert_fa(root_fa[i-1],root_fa[i],2,3);
// printf("root_fa[%d]:%d\n",i,root_fa[i]);
// printf("the %d watch:\n",i);
// watch(root_fa[i],1,n);
}
return ;
}
BZOJ 3674 可持久化并查集加强版(路径压缩版本)的更多相关文章
- BZOJ 3674 可持久化并查集加强版(按秩合并版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ...
- BZOJ 3674 可持久化并查集加强版(主席树变形)
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Submit: 2515 Solved: 1107 [Submit][Sta ...
- bzoj 3674: 可持久化并查集加强版 (启发式合并+主席树)
Description Description:自从zkysb出了可持久化并查集后……hzwer:乱写能AC,暴力踩标程KuribohG:我不路径压缩就过了!ndsf:暴力就可以轻松虐!zky:…… ...
- BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...
- bzoj 3674 可持久化并查集加强版——可持久化并查集
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3674 用主席树维护 fa[ ] 和 siz[ ] .改 fa[ ] 和改 siz[ ] 都 ...
- BZOJ 3674: 可持久化并查集加强版
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3674 题意:三种操作:(1)合并ab所在集合:(2)查询ab是否在一个集合:(3) ...
- BZOJ 3674 可持久化并查集加强版 可持久化并查集
题目大意:同3673 强制在线 同3673 仅仅只是慢了一些0.0 这道题仅仅写路径压缩比仅仅写启示式合并要快一点点 两个都写就慢的要死0.0 改代码RE的可能是内存不够 #include<cs ...
- 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- bzoj 3673&3674 可持久化并查集&加强版(可持久化线段树+启发式合并)
CCZ在2015年8月25日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...
随机推荐
- 18124 N皇后问题
18124 N皇后问题 时间限制:2000MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC;VC Description 有N*N的国际象棋棋盘,要 ...
- ORACLE 按表字段值的不同统计数量
select p.id comperitorId,p.compcorp competitorName, sum(case when c.kindname = 'ATM' then c.num else ...
- 关于ShapeDrawable应用的一些介绍(上)
在Android中, 很多时候系统原生的控件的格式并不能满足我们的需求,我们想要更加好看点的样式,像什么圆角矩形啊,颜色渐变啊,阴影效果啊等等的,这个时候就是我们的 ShapeDrawable发挥效果 ...
- SwiftUI 官方教程(八)
8. 动态生成预览 接下来,我们会在 LandmarkList_Previews 中添加代码以在不同的设备尺寸上渲染列表.默认情况下,预览会以当前的 scheme 中设备的大小进行渲染.我们可以通过调 ...
- C# 数组动态添加新元素的 方法
经常在开发中 会对字符串 进行split 拆分操作.. 得到数组后再去做相应的事情! 但有时候,需求决定了 数组的长度 不是固定的, 而C# 数组 是不允许动态添加新的元素的.. 这事情让我也纠结了 ...
- Scrapy中的核心工作流程以及POST请求
五大核心组件工作流程 post请求发送 递归爬取 五大核心组件工作流程 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事务(框架核心) 调度器(Scheduler)用来接受引擎发过来的请求, ...
- HDU 3018 一笔画问题
题意:给你一个图 判断最少用几笔把这个图画出来(画过的边不能重新画) 思路: 并查集+欧拉回路 仔细想一想. 在一个强连通分量中 所有度为奇数的点之和÷2就是要画的笔画数 Now question : ...
- Delete, drop table, truncate之间的区别
Delete, drop table, truncate有什么区别? delete 删除表中数据,可以删除一条或多条记录,可以回滚,记录操作日记,是DML truncate table,一次性清空表中 ...
- Html Ajax上传文件,form表单下载文件
Html中的代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&quo ...
- JavaScript——视频插入
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...