非旋Treap 學習筆記

2021-08-14 12:25:44 字數 2473 閱讀 2060

今天學習了一下非旋tr

eap 聽說效率很高而且可持久化(一臉懵逼qa

q ) 非旋treap主要是兩個操作sp

lit 和me

rge 下面簡單描述一下(得先會tr

eap 啊 ) va

l :點的值 ke

y :ra

nd的值 sp

lit : 就是我們把原tr

eap 拆成兩個tr

eap

x,y 比如以va

lue 為分界線 小於他的在

x 裡,大於他的在

y裡 具體操作時 如果當前點i的va

l[i]

≤val

ue則將他加入

x 中 那麼他的左子樹都肯定小於va

l[i]

所以也在

x 中 接下來我們就去右子樹中繼續操作 那麼下一次如果還往

x裡加j 一定有va

l[j]

>va

l[i]

即應該加在

x 上一次插入點(這裡就是我們剛加的

i) 的右子樹中 那麼在

y 中就是反過來啦

void split(int

now,intint&rtr,int value)

(data[now].val<=value)?(ltr=now,split(data[now].ch[1],data[ltr].ch[1],rtr,value)):(rtr=now,split(data[now].ch[0],ltr,data[rtr].ch[0],value));

up(now);

}

me

rge:剛才把原tr

eap 拆開了 那肯定也要合併 我們這裡講兩個tr

eap

x,y 的合併 其中

x 的所有節點va

l都小於y中的va

l (也是最常用的)

對於當前的x,

y 要是

x 的ke

y值比y 的小 那很明顯 要把

x這個點放靠上的位置 那和sp

lit 相同的 後面再加進來的肯定va

l 都比這個點大 所以加在這個點的右子樹上 同理小於就是反過來啦

void merge(int&now,int s,int b) 

(data[s].keynow=s,merge(data[now].ch[1],data[s].ch[1],b)):(now=b,merge(data[now].ch[0],s,data[b].ch[0]));

up(now);

}

具體的其他操作基本上都是建立在這兩個操作上的

我們以模板題p3369 【模板】普通平衡樹(treap/sbt) 為例

直接上**<( ̄▽ ̄)/

#include

#define bug(x) cout<<(#x)<<" "<<(x)<#define ll long long

#define inf int_max

using namespace std;

const

int n=1e5+5;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}struct treapdata[n*2];

int m,rt,tot;

void make_data(int&now,int

value)

void up(int now)

void merge(int&now,int s,int b)

(data[s].key1],data[s].ch[1],b)):(now=b,merge(data[now].ch[0],s,data[b].ch[0]));

up(now);

}void split(int now,intint&rtr,int

value)

(data[now].val<=value)?(ltr=now,split(data[now].ch[1],data[ltr].ch[1],rtr,value)):(rtr=now,split(data[now].ch[0],ltr,data[rtr].ch[0],value));

up(now);

}void insert(int

value)

void del(int

value)

void rnk(int

value)

void find(int now,int x)

printf("%d\n",data[now].val);

}void pre(int

value)

void sub(int

value)

int main()

return

0;}

fhq treap(無旋treap) 學習筆記

首先最好要會寫treap 也先了解一下笛卡爾樹是什麼。fhq treap和treap同樣有乙個隨機分配的rnd值,用於平衡,但fhq treap不需要旋轉操作來維持平衡,因為有兩個神奇的操作merge和split 在兩種操作之前,要明確的一點是fhq treap依靠rnd值來維護平衡,把每個點按照小...

平衡樹之非旋Treap

線段樹不支援插入or刪除乙個數於是平衡樹產生了 常見平衡樹 treap 比sbt慢,好寫吧 sbt 快,比較好寫,有些功能不支援 splay 特別慢,複雜度當做根號n來用,功能強大,不好寫 rbt 紅黑樹,特別快 替罪羊樹,朝鮮樹 晚上要講的不旋轉平衡樹 節點的左兒子中的每乙個一定比他小,右兒子中的...

無旋treap學習小記

高一才學這麼基本的平衡樹,退役了 鑑於旋轉treap不能可持久化,與splay相比除了常數小以外沒有什麼不同,所以就不學了。treap tree heap,即二叉搜尋樹 堆 它的中序遍歷是有序的,這是二叉搜尋樹的性質。且對於每乙個點有乙個隨機的鍵值,對於整個樹的任意一棵子樹,鍵值滿足堆的性質。基於隨...