可持久化並查集rope大法
#include<iostream> #include<cstdio> #include<cstdlib> #include<ext/rope> using namespace std; using namespace __gnu_cxx; #define maxn 200005 int n,m; rope<int> *fa[maxn]; int a[maxn];//int *a; int find(int i,int x) { if(x!=fa[i]->at(x)) { int f=find(i,fa[i]->at(x)); if(f==fa[i]->at(x)) return f;//本來這句話可以不加。但是因為replace有空間開銷(自己猜測)所以這樣可以省點空間的樣子 fa[i]->replace(x,f); return f; } return x; } void Union(int i,int x,int y) { int fx=find(i,x),fy=find(i,y); if(fx!=fy) fa[i]->replace(fx,fy); } int main() { cin>>n>>m; for(int i=0;i<=n;i++) a[i]=i; fa[0]=new rope<int>(a,a+n+1);//(&a[1],&a[n+1]) for(int i=1;i<=m;i++) { int op;scanf("%d",&op); if(op==1) { int a,b; scanf("%d%d",&a,&b); fa[i]=new rope<int>(*fa[i-1]); Union(i,a,b); continue; } if(op==2) {int k; scanf("%d",&k); fa[i]=new rope<int>(*fa[k]); continue; } if(op==3) { fa[i]=new rope<int>(*fa[i-1]); int a,b;scanf("%d%d",&a,&b); printf("%d\n",(find(i,a)==find(i,b))); } } return 0; }
相關推薦
可持久化並查集rope大法
開始學習鬼畜stl#include<iostream> #include<cstdio> #include<cstdlib> #include<ext/ro
可持久化並查集加強版 BZOJ 3674
log 歷史 clear 必須 new 路徑壓縮 都是 return 父節點 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 3674: 可持久化並查集加強版 Time Limit: 15 Sec Memory
BZOJ 3674 可持久化並查集加強版(主席樹變形)
als ret desc scan sync scanf ops 只需要 ica 3673: 可持久化並查集 by zky Time Limit: 5 Sec Memory Limit: 128 MB Submit: 2515 Solved: 1107 [
[BZOJ 3551] Peaks 半可持久化並查集 可持久化線段樹合並
algorithm roo i++ name def amp merge zoj 可持久化線段樹 實現 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib>
bzoj 3674: 可持久化並查集加強版
合並 struct 操作 logs void des 查詢 uil 出了 Description Description: 自從zkysb出了可持久化並查集後…… hzwer:亂寫能AC,暴力踩標程 KuribohG:我不路徑壓縮就過了! ndsf:暴力就可以輕松虐! z
可持久化並查集
比較 root urn amp down truct 表示 void roo 如果不采用路徑壓縮而只采用按秩合並,那麽並查集的可持久化是比較容易實現的。按秩合並可以保證一棵 $n$ 個節點的樹的高度是 $O(\log n)$ 的。 實現方法: 用 $r_v$ 表示 $v$
洛谷P3402 【模板】可持久化並查集(可持久化線段樹,線段樹)
std 樹節點 https case 深度 build eof spa 復雜度 orz TPLY 巨佬,題解講的挺好的。 這裏重點梳理一下思路,做一個小小的補充吧。 寫可持久化線段樹,葉子節點維護每個位置的fa,利用每次只更新一個節點的特性,每次插入\(logN\)個節點,
[bzoj] 3673 3674 可持久化並查集 || 可持久化數組
www. getchar 可持久化線段樹 for puts == markdown efi query 原題 加強版 題意: 可持久化並查集模板…… 題解: 用可持久化線段樹維護一個可持久化數組,來記錄每一次操作後的狀態。 不能用路徑壓縮,但是要按置合並,使復雜度保證在O(
可持久化並查集總結
模板題 線段樹 它的 blog 節點 ldb efi 主席樹 tdi 可持久化並查集總結
可持久化並查集模板
#include<bits/stdc++.h> using namespace std; const int MAXN=1e6+2333; int n,m; int a[MAXN]; struct Persistable_Segment_Tree{ struc
bzoj 3673 可持久化並查集 by zky
Description n個集合 m個操作操作:1 a b 合併a,b所在集合2 k 回到第k次操作之後的狀態(查詢算作操作)3 a b 詢問a,b是否屬於同一集合,是則輸出1否則輸出0 0<n,m<=2*10^4 Input Outpu
P3402 【模板】可持久化並查集
res void include getc pro case bits const data 傳送門 //minamoto #include<bits/stdc++.h> using namespace std; #define getc() (p1==p2&a
BZOJ3674:可持久化並查集加強版
淺談主席樹:https://www.cnblogs.com/AKMer/p/9956734.html 題目傳送門:https://www.lydsy.com/JudgeOnline/problem.php?id=3674 因為要支援歷史操作,所以我們用可持久化線段樹來維護並查集的祖先陣列。 因為要路徑壓
解題:洛谷3402 可持久化並查集
題面 滾下去補學考之前更一發 基於可持久化線段樹實現(我不很喜歡“主席樹”這個名字),注意不能路徑壓縮,首先這與可持久化的思想衝突(即儘量利用之前已有的部分,只修改有修改的部分,路徑壓縮壓完了豈不是gg),其次每次壓縮還會有一個log的時間複雜度(查詢),然後複雜度就是$O(n\log n)$的
[學習筆記]可持久化資料結構 可持久化並查集
可持久化:支援查詢歷史版本和在歷史版本上修改 可持久化陣列 主席樹做即可。 【模板】可持久化陣列(可持久化線段樹/平衡樹) 可持久化並查集 可持久化並查集 主席樹做即可。 要按秩合併。(路徑壓縮每次建logn條鏈,會卡爆空間MLE) 主席樹節點,維護father
BZOJ 3674: 可持久化並查集模板
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <string> using namespace std; void setIO(string a){ fr
可持久化專題(三)——可持久化並查集
前言 要學可持久化並查集,必須先會可持久化陣列。 簡介 可持久化並查集應該是一個挺實用的資料結構(例如NOI2018Day1T1中就有它的身影)。 它主要建立於可持久化陣列的基礎之上(而可持久化陣列
關於可持久化並查集的學習和思考
鑑於noip比賽前集訓時SAKER前輩教了我這個蒟蒻可持久化線段樹以來,我懂得了如何維護一個支援歷史查詢的線段樹。於是我就開始異想天開了:可不可以快速維護一個支援歷史查詢的陣列呢? 就在這時,我上網看到了一個新的演算法:可持久化並查集。先用例題來講吧: BZOJ3674:可
BZOJ5415:[NOI2018]歸程(可持久化並查集,最短路)
Description Input Output Sample Input1 1 4 3 1 2 50 1 2 3 100 2 3 4 50 1 5 0 2 3 0 2 1 4 1 3 1 3 2 Sample Output1 0 50 200 50
可持久化並查集(三)——從動態到可持久化
中已經可以算是一個偽可持久化了,但是對於歷史查詢等操作無能為力。。所以本篇重點介紹可持久化操作 BZOJ 3673 題目連線 這題不知道出題人什麼做法,但是程式碼很短的樣子 UPD:出題人用的是rope,即stl中的可持久化