替罪羊樹學習筆記

2022-05-11 13:20:30 字數 1108 閱讀 3965

替罪羊樹是一種平衡樹。然而它既不能可持久化,又不能維護區間。

所以把它發明出來幹嘛?

然而它可以維護子樹內資訊。這個是一眾平衡樹都不能做到的功能。

它維護平衡的方式和普通的平衡樹瘋狂旋轉不太一樣。它是如果這個子樹不平衡就把這個子樹拍平了重構。

具體地,如果左子樹的節點數和右子樹的節點數比值超過某個值或小於某個值,那麼就把這顆子樹的中序遍歷求出來,然後每次提取當前中序遍歷中點,左兒子是左邊中點,右兒子是右邊中點。遞迴建樹即可。

另外它的刪除也和其它平衡樹不太一樣。它是惰性刪除。即打乙個標記然後在重構的時候再刪。所以在求排名和kth時要注意當前點是否為空節點。

注意要依據

沒了,其它就和普通bst差不多了。時間複雜度\(o(nlogn)\),常數還蠻小的。

放一下洛谷上模板的code:

#include#define db double

#define l(x) f[x].l

#define r(x) f[x].r

#define alpha 0.7

using namespace std;

int n,m,k,x,y,z,cnt,root,op;

struct treef[100039];

int st[100039],sh;

inline int newnode(int x);return cnt;}

inline void dfs(int x)

inline void up (int x)

inline int build(int l=1,int r=sh)

inline void make(int &x)

inline int check(int x)

inline void del(int x,int &now)

(x>f[now].sum)?del(x,r(now)):del(x,l(now));

up(now);if(check(now)) make(now);

}inline int rk(int x,int &now)

inline int kth(int x,int &now)

int main()

}

替罪羊樹學習筆記

教練講旋轉的時候摸魚去了,然後就不會旋轉操作了t t,那怎麼辦呢,要做題的啊,誒,替罪羊樹好像是不用旋轉的誒qwq,就它了。替罪羊樹這樣直接講不直觀,還是看題來講吧。上題 洛谷 p3369 模板 普通平衡樹 概念 思想 替罪羊樹屬於平衡樹的一種,但是他維護平衡的方式不是複雜的旋轉,而是直接把這棵子樹...

替罪羊樹學習筆記

部落格咕咕咕了好久 最近會逐步繼續恢復更新部落格的。最近又在學習二叉搜尋樹。實測發現替罪羊樹快的飛起 時間約splay的1 2 寫起來還比較簡單,決定來一波。那為什麼還要用splay呢?因為splay是序列之王!還能維護lct!你要用非旋treap fhq treap 我也沒意見 替罪羊樹的主要思想...

總結 替罪羊樹學習筆記

突然不會寫學習筆記了.反正是給自己看的 那就想到哪寫到哪吧 不基於旋轉而基於暴力重構的平衡樹 採用懶惰刪除法 每次刪除只打標記,在重構時統一刪除 如果某個點的子樹過於不平衡或刪除了過多的元素 那就需要進行重構 重構時暴力dfs整棵子樹,碰見打了刪除標記的節點就扔進記憶體池,否則按照中序遍歷存下來,然...