BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
2024-08-26 07:22:55
既然有了可持久化数组,就有可持久化并查集。。
由于上课讲过说是只能按秩合并(但是我也不确定。。。),所以就先写了按秩合并,相当于是维护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
最新文章
- Leetcode 15. 3Sum
- 《C#微信开发系列(4)-接收 / 返回文本消息》
- 关于 矩阵在ACM中的应用
- 设计模式之美:Behavioral Patterns(行为型模式)
- 关于js SDK的程序,java SDK的程序
- Java vararg(动态参数)的应用
- 夺命雷公狗—angularjs—23—copy拷贝对象
- ural 1112,LIS
- c++程序编码
- [iOS 多线程 &; 网络 - 2.3] - 解析xml
- HDU 3359 Kind of a Blur(高斯消元)
- 再造 “手机QQ” 侧滑菜单(三)——视图联动
- SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3&;nbsp
- Spring 学习笔记 Bean的作用域
- java中的线程问题(三)——继承Thread VS 实现Runnable的区别
- SpringDataRedis事务 专题
- Word2016“此功能看似已中断 并需要修复”
- bzoj千题计划158:bzoj2406: 矩阵(有源汇上下界可行流)
- 我学习的第一个uiautomator从创建到运行结束
- UIKit中的几个核心对象的介绍:UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍