目錄luogu扣圖:
由於fhq-treap是沒有旋轉操作的
所以每次操作後的其它沒有操作的節點間的關係不變
而有旋轉平衡樹是要改變的,所以就不大能進行可持久化了
回想,主席樹的方法:
每次用log的記憶體記錄一次操作
這可持久平衡樹也一樣
每次merge或者split都新開節點記錄路徑
路徑是log級的,所以記憶體也在nlogn的級別(當然不是nlog,是操作log)
還是用結構體吧,容易賦值
其實也就是加了幾句話
其實也就是和主席樹差不多
其實也沒啥說的,看**去吧
sovietpower:一點(很小的)優化? 操作3.4.5.6都不會改原樹,root[i]=root[ver]可以直接賦值,不需要再merge了
xx:為什麼
我們擷取merge函式的一部分
if(e[x].pri那是不是可以寫成if(e[x].pri當然是不對的啊,你還要遞迴呢,cnt當然要變化了這陣列模擬記憶體浪費的有點多呀,指標應該就沒這毛病了,不過我還是學不下去指標233#include #include #include #include #include #define ls(x) e[x].ls
#define rs(x) e[x].rs
#define for(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int maxn=500007;
const int inf=0x7fffffff;
int read()
struct node e[maxn*50];
int cnt,rt[maxn*50];
void pushup(int x)
int make_edge(int x)
int merge(int x,int y)
else
}void split(int now,int k,int &x,int &y)
else
}}inline int k_th(int now,int k)
}int main() else if(opt==2) else if(opt==3) else if(opt==4) else if(opt==5)
else printf("%d\n",-inf);
} else
else printf("%d\n",inf);}}
return 0;
}
可持久化 可持久化資料結構學習筆記
我終於也要學可持久化了qwq 膜wjmzbmr 線 割 分 是 我 資料結構的可持久化,就是把乙個資料結構的歷史狀態全都儲存下來,從而能夠快速查詢之前出現過的某個操作的結果。當然這必然會帶來很大的時間和空間消耗,因此優越的可持久化都會充分利用資料結構歷史狀態裡的相似部分來減少時間和空間複雜度。顯然有...
可持久化陣列學習筆記
推薦先閱讀 可持久化線段樹學習筆記 一 定義 可進行修改,並支援如下兩功能的陣列 1.在某個歷史版本上修改某乙個位置上的值 2.訪問某個歷史版本上的某一位置的值 二 原理 如果你已經學會了可持久化線段樹 我就當你會了,不會見題頭 會發現其實可持久化陣列已經 含在 樹中,或者說借 樹實現的 建樹與修改...
可持久化Treap
本來是想寫一點題的,但是hfu最近讓我改鍵盤指法,原來都是亂打 手速蠻快就是錯的多 剛開始練手法真的煩躁,像我這種從來不用小指頭的 就寫個學習筆記吧.非教程向,只是懂了後寫點隨筆,練成指法說不定能來填坑.可持久化treap首先是基於非旋轉式treap的,如果要旋轉的話那麼就會破壞父子關係導致無法可持...