洛谷P3402 【模板】可持久化并查集
一定注意每一次都要是 $root[cur]=root[cur-1]$,不然进行合并时如果 $a,b$ 在同一集合中就会使 $root[cur]=0$.
Code:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
//ty==1 for size, ty==0 for fathervoid setIO(string a){ freopen((a+".in").c_str(),"r",stdin); }#define maxn 200005
int n,m,cur,root[maxn*4];
struct Node{ int f,siz; Node(int f=0,int siz=0):f(f),siz(siz){}
};
struct Segment_Tree{int lson[maxn*50],rson[maxn*50],fa[maxn*50],siz[maxn*50];int nodes;void build(int l,int r,int &o){if(l>r)return;o=++nodes;if(l==r) { siz[o]=1,fa[o]=l; return; }int mid=(l+r)>>1;build(l,mid,lson[o]), build(mid+1,r,rson[o]);} int update(int l,int r,int o,int pos,int ty,int k){int oo=++nodes;lson[oo]=lson[o],rson[oo]=rson[o],fa[oo]=fa[o],siz[oo]=siz[o];if(l==r) { if(ty==1) siz[oo]=k; if(ty==0) fa[oo]=k;return oo;}int mid=(l+r)>>1;if(pos<=mid) lson[oo]=update(l,mid,lson[o],pos,ty,k);else rson[oo]=update(mid+1,r,rson[o],pos,ty,k);return oo;}Node query(int l,int r,int o,int pos){if(l==r){ return Node(fa[o],siz[o]); }int mid=(l+r)>>1;if(pos<=mid) return query(l,mid,lson[o],pos);else return query(mid+1,r,rson[o],pos);}Node find(int x,int state){Node p=query(1,n,root[state],x);return p.f==x?p:find(p.f,state);}void merge(int a,int b,int state){Node x=find(a,state), y=find(b,state);if(x.f==y.f) return;if(x.siz>y.siz) root[cur]=update(1,n,root[state],x.f,1,y.siz+x.siz),root[cur]=update(1,n,root[cur],y.f,0,x.f);else root[cur]=update(1,n,root[state],y.f,1,y.siz+x.siz),root[cur]=update(1,n,root[cur],x.f,0,y.f);}int ask(int a,int b,int state){Node x=find(a,state),y=find(b,state);if(x.f==y.f)return 1; return 0;}
}S;
int main(){// setIO("input");int opt,a,b,lastans=0;scanf("%d%d",&n,&m);S.build(1,n,root[0]);for(cur=1;cur<=m;++cur){scanf("%d",&opt);root[cur]=root[cur-1];switch(opt){case 1: { scanf("%d%d",&a,&b),a^=lastans,b^=lastans,S.merge(a,b,cur-1); break;}case 2: { scanf("%d",&a),a^=lastans,root[cur]=root[a]; break;}case 3: { scanf("%d%d",&a,&b),a^=lastans,b^=lastans,lastans=S.ask(a,b,cur-1),printf("%d\n",lastans); break;}}}return 0;
}
转载于:https://www.cnblogs.com/guangheli/p/10087451.html
洛谷P3402 【模板】可持久化并查集相关推荐
- 洛谷P1536村村通(并查集模板题)
问题出处: https://www.luogu.com.cn/problem/P1536 题目描述: 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府 " ...
- 洛谷 p1197 [JSOI2008]星球大战(并查集)
洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...
- 洛谷 P1892 [BOI2003]团伙(并查集变种 反集)
[BOI2003]团伙 题目描述 现在有 n n n 个人,他们之间有两种关系:朋友和敌人.我们知道: 一个人的朋友的朋友是朋友 一个人的敌人的敌人是朋友 现在要对这些人进行组团.两个人在一个团体内当 ...
- 洛谷1196 银河英雄传说(并查集)
传送门 [题目分析] 题目整个就一赤裸裸的并查集啊....就多了一个记录深度.... 每次M操作就是merge x->y,每个并查集,记录父亲.大小.深度三个值,每次find父亲的时候记录深度即 ...
- 洛谷P1536 村村通【并查集】
题目链接:P1536 村村通 程序说明: n个集合需要用n - 1条线连接起来,因此合并完集合后,循环遍历所有点,记录集合的总数,减一则为正确答案 代码如下: #include <iostrea ...
- 洛谷.3919.[模板]可持久化数组(可持久化线段树/平衡树)
题目链接 //利用先前的根节点建树 想一下不难写. #include <cstdio> #include <cctype> //#define gc() getchar() # ...
- [洛谷P3940]:分组(贪心+并查集)
题目传送门 题目描述 小$C$在了解了她所需要的信息之后,让兔子们调整到了恰当的位置.小$C$准备给兔子们分成若干个小组来喂恰当的胡萝卜给兔子们吃. 此时,$n$只兔子按一定顺序排成一排,第$i$只兔 ...
- 【洛谷】P2814 家谱(并查集)**
穿越隧道 需要注意输入输出的使用 以及查找某个字符串的父亲字符串,这种数据结构若没想清直接用string p[N],是行不通的.: N为整型,不能为字符串.看到大佬的题解,有的使用的是map<s ...
- 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]
题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...
- [NOI2018] 归程 可持久化并查集
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个n 个节点.m 条边的无向连通图(节点的编号从 1至 n).我们依次用 l,a描述一条边的长度.海拔. ...
最新文章
- 广东2021高考成绩查询6,2021全国高考6月10日全部结束 预计最快6月23日可查高考成绩...
- 一个中科院退学博士生的感想(zz)
- 3.1 SVM原理入门
- Nutanix,在转型的道路上越走越远 | 人物志
- (34)css光标属性cursor
- uml类图用什么软件画_为什么需要UML类图建模?
- python初级第三库(人工智能,web解析,人机交互)
- inotify+rsync实时双向同步文件
- Spring boot工程创建
- java随机数种子_使用种子的Java随机数
- 半导体器件物理【6】固体量子——各种电子有效质量 + 状态密度函数
- Unix环境高级编程—进程控制(三)
- 介绍一种AI的抠图方法
- oracle查询数字类溢出,有趣的数值溢出(一)
- Android 4.2虚拟按键背景透明,Android 4.0 隐藏虚拟按键(导航栏)的方法
- Python使用Eel和HTML开发桌面应用
- JAVA计算机毕业设计晨光文具店进销存系统设计与开发计算机(附源码、数据库)
- XENOGEARS,延续万年的的永恒之爱(引)
- 【中科院】分子生物学-朱玉贤第四版-笔记-第11-12讲 基因功能研究技术
- android智能识别技术,基于Android平台的OCR识别技术研究与实现