既然有了可持久化数组,就有可持久化并查集。。

由于上课讲过说是只能按秩合并(但是我也不确定。。。),所以就先写了按秩合并,相当于是维护fa[]和rk[]

getf就是在这棵树中找,直到找到一个点的fa[x]==x

之所以这种写法不能路径压缩,个人理解是因为路径压缩会破坏原先的结构。。。反正我魔改改错了。。。先咕着路径压缩qwq

下面是加强版的代码。。。只有按秩合并

#include<cstdio>
#include<iostream>
#define R register int
#define pc(x) putchar(x)
using namespace std;
const int N=2E5+,M=1E7+;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,tot,lst,crt;
int rt[N],ls[M],rs[M],vl[M],rk[M];
inline void build(int& tr,int l,int r) { tr=++tot;
if(l==r) {vl[tr]=l,rk[tr]=; return; } R md=l+r>>;
build(ls[tr],l,md),build(rs[tr],md+,r);
}
inline void ins(int& tr,int lst,int l,int r,int pos,int v) {
tr=++tot,ls[tr]=ls[lst],rs[tr]=rs[lst],vl[tr]=vl[lst],rk[tr]=rk[lst];
if(l==r) {vl[tr]=v; return ;} R md=l+r>>;
pos<=md?ins(ls[tr],ls[lst],l,md,pos,v):ins(rs[tr],rs[lst],md+,r,pos,v);
}
inline int getf(int tr,int l,int r,int pos) {
if(l==r) {return pos==vl[tr]?tr:getf(rt[crt],,n,vl[tr]);} R md=l+r>>;
return (pos<=md)?getf(ls[tr],l,md,pos):getf(rs[tr],md+,r,pos);
}
inline void add(int& tr,int lst,int l,int r,int pos) {
tr=++tot; ls[tr]=ls[lst],rs[tr]=rs[lst],vl[tr]=vl[lst],rk[tr]=rk[lst];
if(l==r) {++rk[tr]; return ;} R md=l+r>>;
pos<=md?add(ls[tr],ls[lst],l,md,pos):add(rs[tr],rs[lst],md+,r,pos);
}
signed main() {
n=g(),m=g(); build(rt[],,n);
for(R i=;i<=m;++i) {
R k=g(),a=g()^lst,b; if(k==) { rt[i]=rt[i-],crt=i;
b=g()^lst; a=getf(rt[i],,n,a); b=getf(rt[i],,n,b);
if(vl[a]!=vl[b]) {
if(rk[a]<rk[b]) swap(a,b);
ins(rt[i],rt[i-],,n,vl[b],vl[a]);
if(rk[a]==rk[b]) add(rt[i],rt[i],,n,vl[a]);
}
} else if(k==) rt[i]=rt[a];
else { rt[i]=rt[i-],crt=i; b=g()^lst;
a=getf(rt[i],,n,a),b=getf(rt[i],,n,b);
vl[a]==vl[b]?(lst=,pc(''),pc('\n')):(lst=,pc(''),pc('\n')); //cout<<"fasdhfjlkasdf"<<endl;
}
} //while(1);
}

2019.05.06

最新文章

  1. Leetcode 15. 3Sum
  2. 《C#微信开发系列(4)-接收 / 返回文本消息》
  3. 关于 矩阵在ACM中的应用
  4. 设计模式之美:Behavioral Patterns(行为型模式)
  5. 关于js SDK的程序,java SDK的程序
  6. Java vararg(动态参数)的应用
  7. 夺命雷公狗—angularjs—23—copy拷贝对象
  8. ural 1112,LIS
  9. c++程序编码
  10. [iOS 多线程 &amp; 网络 - 2.3] - 解析xml
  11. HDU 3359 Kind of a Blur(高斯消元)
  12. 再造 “手机QQ” 侧滑菜单(三)——视图联动
  13. SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3&amp;nbsp
  14. Spring 学习笔记 Bean的作用域
  15. java中的线程问题(三)——继承Thread VS 实现Runnable的区别
  16. SpringDataRedis事务 专题
  17. Word2016“此功能看似已中断 并需要修复”
  18. bzoj千题计划158:bzoj2406: 矩阵(有源汇上下界可行流)
  19. 我学习的第一个uiautomator从创建到运行结束
  20. UIKit中的几个核心对象的介绍:UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

热门文章

  1. 文件上传框的美化+预览+ajax
  2. Python:sample函数
  3. JS---星星评分
  4. SQL 时间及字符串操作
  5. python的gzip库使用方法
  6. 字符编码ANSI、ASCII、GB2312、GBK、GB18030、UNICODE、UTF-8小结
  7. shell脚本监控MySQL主从同步
  8. CentOS 6.5 and Ubuntu 14.04 使用外部邮箱发送邮件
  9. 正则表达式需要匹配的内容本身就自带了html转义字符,需要转义,否则无法匹配
  10. 8、Transcriptome Assembly