1. 程式人生 > >可持久化並查集rope大法

可持久化並查集rope大法

開始學習鬼畜stl
#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中的可持久化