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值來維護平衡,把每個點按照小...