BZOJ 3674: 可持久化并查集加强版
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3674
题意:三种操作:(1)合并ab所在集合;(2)查询ab是否在一个集合;(3)状态回到第x个操作之前。
思路:(1)每个节点保存一个深度;合并时找到两个节点的根,ra,rb,若ra的深度小,则ra的父亲设为rb,否则rb的父亲设为ra;(2)查询直接找到两个的根。这个的复杂度是多少呢?貌似是logn*logn。每次查询logn,深度logn;(3)这个就比较好操作了。
int ls[M],rs[M],dep[M],mp[M]; int e; int root[N]; int n,m; void build(int &t,int L,int R) { t=++e; if(L==R) { mp[t]=L; return; } int M=(L+R)>>1; build(ls[t],L,M); build(rs[t],M+1,R); } int get(int t,int L,int R,int x) { if(L==R) return t; int M=(L+R)>>1; if(x<=M) return get(ls[t],L,M,x); return get(rs[t],M+1,R,x); } int get(int t,int x) { int p=get(t,1,n,x); if(mp[p]==x) return p; return get(t,mp[p]); } void upd(int L,int R,int x,int &y,int pos,int val) { y=++e; if(L==R) { mp[y]=val; return; } ls[y]=ls[x]; rs[y]=rs[x]; int M=(L+R)>>1; if(pos<=M) upd(L,M,ls[x],ls[y],pos,val); else upd(M+1,R,rs[x],rs[y],pos,val); } void add(int L,int R,int k,int pos) { if(L==R) { dep[k]++; return; } int M=(L+R)>>1; if(pos<=M) add(L,M,ls[k],pos); else add(M+1,R,rs[k],pos); } int main() { n=getInt(); m=getInt(); build(root[0],1,n); int i; int ans=0; for(i=1;i<=m;i++) { int op; int x,y,k; op=getInt(); if(op==1) { x=getInt(); y=getInt(); x^=ans; y^=ans; root[i]=root[i-1]; x=get(root[i],x); y=get(root[i],y); if(mp[x]==mp[y]) continue; if(dep[x]>dep[y]) swap(x,y); upd(1,n,root[i-1],root[i],mp[x],mp[y]); if(dep[x]==dep[y]) add(1,n,root[i],mp[y]); } else if(op==2) { k=getInt(); k^=ans; root[i]=root[k]; } else { x=getInt(); y=getInt(); x^=ans; y^=ans; root[i]=root[i-1]; x=get(root[i],x); y=get(root[i],y); if(mp[x]==mp[y]) puts("1"),ans=1; else puts("0"),ans=0; } } }
BZOJ 3674: 可持久化并查集加强版的更多相关文章
- BZOJ 3674 可持久化并查集加强版(路径压缩版本)
/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=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 可持久化并查集加强版 可持久化并查集
题目大意:同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日也就是初三暑假要结束的时候就已经能切这种题了%%% 学习了另一种启发式合并的方法,按秩合并,也就是按树的深度合并,实际上是和按树的大小一个道理,但是感觉(至少在这题上)更好 ...
随机推荐
- JS中数组的操作
1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...
- 由Unicode编码想到弄懂编码表
test unicode好 007400650073007400200075006E00690063006F00640065597D 这是一个Unicode编码,一共六七万的汉字,可以说Unicode ...
- 我的AutoCAD二次开发之路 (一)
原帖地址 http://379910987.blog.163.com/blog/static/33523797201011184552167/ 今天在改代码的时候,遇到了AddVertexAt方法的用 ...
- Compress a Folder/Directory via Perl5
Compress a Folder/Directory via Perl5 tested in Windows, Mac OS X, Ubuntu16.04 #!/usr/bin/perl #压缩指定 ...
- makefile 中 $@ $^ %< 使用【转】
转自:http://blog.csdn.net/kesaihao862/article/details/7332528 这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将 ...
- Java中Properties类的使用
1.properties介绍 java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值&quo ...
- html状态码与缓存学习
当浏览器访问一个页面时,浏览者的浏览器会向网页所在的服务器发送请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求. ...
- ACM题目————Robot Motion
Description A robot has been programmed to follow the instructions in its path. Instructions for the ...
- 集合(Collection)使用笔记
Collections.unmodifiableCollection这个可以得到一个集合的镜像,它的返回结果不可直接被改变,否则会提示 java.lang.UnsupportedOperationEx ...
- Java学习之路(七)
1:什么是异常? 中断了正常指令流的事件. 异常是一个对象 ,在出现异常时,虚拟机会生成一个异常对象 生成对象的类是由 JDK 提供的