Fhq Treap 學習筆記

2022-05-06 23:33:10 字數 1232 閱讀 5696

fhq treap 是一種平衡樹,又稱非旋 treap,其特點可以從名字裡明顯看出。

fhq treap 具有**短、拓展性強的優點,在 oi 中的用途較廣。

對於插入 \(v\) 的操作,我們把 treap 拆成 \(\leq v-1\) 和 \(\geq v\) 兩部分,接下來把 \(v\) 和 \(\leq v-1\) 的部分合併,再把這一部分和 \(\ge v\) 的部分合併。

對於刪除 \(v\) 的操作,我們把 treap 拆成 \(\leq v-1\) 和 \(\geq v\) 兩部分,接下來把 \(\ge v\) 的最小點刪除,剩餘部分和 \(\leq v-1\) 的部分合併。

其餘操作同理。

int n, cnt, root;

struct tree

tree[maxn];

int create(int v)

void pushup(int x)

int merge(int x, int y)

else

}void spilt_val(int now, int v, int &x, int &y)

if(tree[now].val <= v) x = now, spilt_val(tree[now].ch[1], v, tree[now].ch[1], y);

else y = now, spilt_val(tree[now].ch[0], v, x, tree[now].ch[0]);

pushup(now);

}void spilt_rk(int now, int k, int &x, int &y)

if(tree[tree[now].ch[0]].siz < k) x = now, spilt_rk(tree[now].ch[1], k - tree[tree[now].ch[0]].siz - 1, tree[now].ch[1], y);

else y = now, spilt_rk(tree[now].ch[0], k, x, tree[now].ch[0]);

pushup(now);

}int main()

if(opt == 2)

if(opt == 3)

if(opt == 4)

if(opt == 5)

if(opt == 6)

}return 0;

}

學習筆記 FHQ Treap

fhq treap 發明者範浩強年年noi金牌 是一種神奇的資料結構,也叫非旋treap,它不像treap zig zag搞不清楚 所以叫非旋嘛 也不像splay完全看不懂,而且它能完成treap與splay能完成的所有事,短,理解也容易。fhq treap和treap很像,都是給每個節點乙個隨機的...

學習筆記 fhq treap

不需要旋轉,只需要 split 和合併 merge 就可以支援 splay 的所有操作。非常好寫,非常好調。並且支援可持久化 雖然我不會 對於每個點需要乙個附加權值,根據這個附加權值維護乙個小根堆,這樣這棵樹平衡與否是由這個附加權值決定的,那麼這個權值該怎麼取呢?隨機!這樣 treap 就大概是平衡...

fhq treap(無旋treap) 學習筆記

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