可持久化Treap

2021-09-30 18:17:05 字數 3036 閱讀 1413

可持久化treap本質上市乙個二叉平衡樹,若不對其規則進行修改,中序遍歷後得出的序列是遞增的。

void maintain(o): 計算結點o的size

int lowcount(key): 比key所在位置小1

int uppercount(key): key所在的位置,如果有多個相同的key,選位置最大的

int select(int k): 找出第k小的數的值

node* merge(node* a, node* b):合併,要用rank來合併

void split(node*a, int k, node*& l, node*& r): 拆分,k包含在l中

int rank(int key):key的排名

void insert(int key):插入key

int pred(int key): 找前驅,比key小的數中最大的那個

int succ(int key):找後繼,比key大的數中最小的那個

#include

using

namespace std;

const

int maxn =

1e6+5;

#define lc son[o][0]

#define rc son[o][1]

struct treap

void

init()

void

maintain

(int o)

void

split

(int o,

int k,

int&l,

int&r)

else

if(sz[lc]

>= k)

else

}int

merge

(int a,

int b)

if(r[a]

< r[b]

)else

}int

lowcount

(int o,

int x)

intupcount

(int o,

int x)

intrank

(int x)

intkth

(int k)

intselect

(int o,

int k)

else

}return val[o];}

void

insert

(int x)

void

del(

int val)

intpred

(int x)

intsucc

(int x)

void

show()

void

print

(int o)};

treap treap;

typedef

long

long ll;

inline

intreadint()

intmain()

if(opt ==2)

if(opt ==3)

if(opt ==4)

if(opt ==5)

if(opt ==6)

}// treap.show();

return0;

}

#include

using

namespace std;

const

int maxn =

1e6+5;

#define lc son[o][0]

#define rc son[o][1]

struct treap

void

init()

void

maintain

(int o)

void

split

(int o,

int k,

int&l,

int&r)

else

if(sz[lc]

>= k)

else

}int

merge

(int a,

int b)

if(r[a]

< r[b]

)else

}int

lowcount

(int o,

int x)

intupcount

(int o,

int x)

intrank

(int x)

intkth

(int k)

intselect

(int o,

int k)

else

}return val[o];}

void

insert

(int x)

void

del(

int val)

intpred

(int x)

intsucc

(int x)

void

show()

void

print

(int o)};

treap treap;

typedef

long

long ll;

inline

intreadint()

intmain()

if(opt ==2)

if(opt ==3)

if(opt ==4)

if(opt ==5)

if(opt ==6)

}// treap.show();

return0;

}

可持久化Treap

本來是想寫一點題的,但是hfu最近讓我改鍵盤指法,原來都是亂打 手速蠻快就是錯的多 剛開始練手法真的煩躁,像我這種從來不用小指頭的 就寫個學習筆記吧.非教程向,只是懂了後寫點隨筆,練成指法說不定能來填坑.可持久化treap首先是基於非旋轉式treap的,如果要旋轉的話那麼就會破壞父子關係導致無法可持...

LOJ 持久化序列 可持久化treap

一道模板題 在寫完這道題以後就去找其他帶翻轉的可持久化treap題去寫了 發現自己根本不會可持久化treap 什麼標記翻轉可持久化 自閉了一整天 網上也沒有找到很好的模板 於是選擇擱置一段時間 等以後時間充裕了再來磕 includeusing namespace std const int maxn...

範浩強treap 可持久化

當平衡樹需要可持久化的時候,意味著我們需要訪問以前的某個時間點的平衡樹,就要保持以前的樹形態不變,新建乙個時間戳,構建一棵新的樹。如果用以前的旋轉treap可能就不方便做到 又要打時間戳,又要新建節點,又要旋轉 而且涉及到旋轉,空間可能會承受不住,我們需要用到一種新的平衡樹 fhq treap 這是...