当前位置: 首页 > news >正文

可持久化并查集

更新日志 2025/07/29:开工。

前言

我竟然没会可持久化并查集。

实现

可持久化平衡树维护一下父节点数组,与按秩合并的秩数组即可。

模板题

LG3402

code
const int N=1e5+5,M=2e5+5;int n,m;struct perseg{int cnt;int rt[M];int ls[N<<6],rs[N<<6],dat[N<<6];void build(int a[],int &x,int l=1,int r=n){if(!x)x=++cnt;if(l==r)return dat[x]=a[l],void();int m=l+r>>1;build(a,ls[x],l,m);build(a,rs[x],m+1,r);}void copy(int x,int y){dat[y]=dat[x],ls[y]=ls[x],rs[y]=rs[x];}void change(int k,int v,int x,int &y,int l=1,int r=n){copy(x,y=++cnt);if(l==r)return dat[y]=v,void();int m=l+r>>1;if(k<=m)change(k,v,ls[x],ls[y],l,m);else change(k,v,rs[x],rs[y],m+1,r);}int query(int k,int x,int l=1,int r=n){if(l==r)return dat[x];int m=l+r>>1;if(k<=m)return query(k,ls[x],l,m);else return query(k,rs[x],m+1,r);}
}fa,rk;int v;
int find(int x){int f;while((f=fa.query(x,fa.rt[v]))!=x)x=f;return x;}
void merge(int a,int b){a=find(a),b=find(b);int rka=rk.query(a,rk.rt[v]),rkb=rk.query(b,rk.rt[v]);if(rka>rkb)swap(a,b),swap(rka,rkb);fa.change(a,b,fa.rt[v],fa.rt[v+1]);if(rka==rkb)rk.change(b,rkb+1,rk.rt[v],rk.rt[v+1]);else rk.rt[v+1]=rk.rt[v];++v;
}
bool same(int a,int b){return find(a)==find(b);}int Fa[N],Rk[N];
inline void Main(){read(n,m);rep(i,1,n)Fa[i]=i,Rk[i]=1;fa.build(Fa,fa.rt[0]);rk.build(Rk,rk.rt[0]);rep(i,1,m){int op;read(op);if(op==1){int a,b;read(a,b);merge(a,b);}else if(op==2){int k;read(k);++v;fa.rt[v]=fa.rt[k];rk.rt[v]=rk.rt[k];}else{int a,b;read(a,b);put(same(a,b));++v;fa.rt[v]=fa.rt[v-1];rk.rt[v]=rk.rt[v-1];}}
}
http://www.sczhlp.com/news/953.html

相关文章:

  • SAP 工序委外简介
  • GitHub汉化教程
  • Django中遇到choice定义的模型类中的字段,通过输入数字展示输出对应中文的需求
  • 提示工程:大语言模型的新特征工程
  • MyEMS开源能源管理系统核心代码解读022
  • 强化集成、可靠性与信任:Stack Overflow for Teams 新功能解析
  • 5090+Ubuntu24.04安装pytorch环境(时间点:202507) - fourk
  • 理解JavaScript中的闭包
  • Air8000 GPIO实战指南:LuatIO配置是否不可或缺?设计建议
  • 普源PVP2150/PVP2350的理想替代方案:西安普科PK6150/PK6350无源探头全面评测
  • 1688商品列表API调用全过程分享
  • 深度揭秘!Java Class 文件加密终极指南,有效保护你的核心代码
  • springboot项目打包成docker镜像
  • 克劳德代码与 Cursor 的问题:AI 编程的死亡螺旋
  • [题解]P5094 [USACO04OPEN] MooFest G 加强版
  • Win10专业版如何关闭Windows错误报告的问题
  • Win11正式版玩游戏输入法冲突的问题
  • Elasticsearch Circuit Breaker 全面解析与最佳实践 - 教程
  • ROS1(20.04 noetic) + PX4 + AirSim
  • 扩散模型-PPDM-95 - jack
  • 5.5 减少过程调用
  • spring springmvc springboot的区别
  • 13N90-ASEMI太阳能逆变器专用13N90
  • 基于Matlab的无人机地面固定目标稳定跟踪
  • 在Go语言微服务中实现服务监控
  • readv() writev()
  • Spring 中的 BeanFactory 和 ApplicationContext
  • Umi 约定式路由解析
  • SFUD库应用教程:串行SPI Flash驱动开发的最佳实践
  • 【刷题笔记】Peaks