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日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...
随机推荐
- Binding Enum to ComboBox
1.添加MarkupExtension public class EnumToSourceExtension : MarkupExtension { private Type _type; publi ...
- 复制DropDownList
DropDownList ddlA; ListItem[] ar = new ListItem[ddlB.Items.Count]; ddlB.Items.CopyTo(ar,0); ddlA.Dat ...
- word2vec (一) 简介与训练过程概要
摘自:http://blog.csdn.net/thriving_fcl/article/details/51404655 词的向量化与word2vec简介 word2vec最初是Tomas Miko ...
- poj 3259-- Wormholes(SPFA)
...
- jQuery右键菜单contextMenu实例
URL: http://www.cnblogs.com/whitewolf/archive/2011/09/28/2194795.html http://www.blogjava.net/superc ...
- [HTML] 微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能
在做一个微信的微网站中的一个便民服务电话功能的应用,用到移动web页面中列出的电话号码,点击需要实现调用通讯录,网页一键拨号的拨打电话功能. 如果需要在移动浏览器中实现拨打电话,发送email,美国服 ...
- ffmpeg实现
最近做一个小项目,要在线播放录制的 MP4 视频,想开源的 flash player 或 html 5 可以播放.可,虽然 MP4 是 H.264 编码,但就是播放不了.可能是封装方式(PS 方式)不 ...
- Hadoop MapReduce编程 API入门系列之MapReduce多种输入格式(十七)
不多说,直接上代码. 代码 package zhouls.bigdata.myMapReduce.ScoreCount; import java.io.DataInput; import java.i ...
- jQuery中样式和属性模块简单分析
1.行内样式操作 目标:扩展框架实现行内样式的增删改查 1.1 创建 css 方法 目标:实现单个样式或者多个样式的操作 1.1.1 css方法 -获取样式 注意:使用 style 属性只能获取行内样 ...
- python爬虫:爬取易迅网价格信息,并写入Mysql数据库
本程序涉及以下方面知识: 1.python链接mysql数据库:http://www.cnblogs.com/miranda-tang/p/5523431.html 2.爬取中文网站以及各种乱码处 ...