重量平衡樹

2022-09-05 18:33:09 字數 1315 閱讀 7292

字尾平衡樹可以支援前端加字元,以平衡樹的形式維護字尾的排名,\(o(1)\) 查詢兩字尾的大小關係。

對於每個字尾,維護乙個值域區間 \(l,r\),其權值為平均 \(m=(l+r)/2\),左右兒子的值域區間為 \((l,m),(m,r)\),排名可以通過權值來比較。由於是在前端加字元,每次只會增加乙個字尾。這個字尾與其它字尾的比較可以通過一下方式進行:

由於深度過深會導致權值精度不足,這裡的平衡樹需要用保證深度不要太深,需要使用重量平衡樹。一般使用替罪羊樹。

複雜度:\(o(n \log n)\)

幾乎完全一致的板子(外層需要套乙個線段樹)

是個假的,沒錯。體驗極差。

但是不管怎麼說也用到了字尾平衡樹。

namespace sgt //bug

}nd[n];

int ttot, root;

#define ls(x) nd[(x)].son[0]

#define rs(x) nd[(x)].son[1]

#define siz(x) nd[(x)].siz

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

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

#define v(x) nd[(x)].v

#define fa(x) nd[(x)].fa

double alpha = 0.75;

inline bool check_rebuild(int cur)

inline void pushup(int cur)

bool cmp(int p, int q)

inline bool cmpare(int p, int q)

int h[n], htot;

void dfs_del(int cur)

void rebuild(int l, int r, int dir, int faa) else

nd[faa].son[dir] = cur;

} else l(cur) = 0, r(cur) = 1e9, v(cur) = (l(cur) + r(cur)) / 2.0, root = cur;

rebuild(l, mid - 1, 0, cur);

rebuild(mid + 1, r, 1, cur);

pushup(cur);

} inline void ins(int pos, int c)

p = lstp;

fa(ttot) = p;

if (cmpare(pos, p)) else

if (pia)

}}

洛谷1268樹的重量(樹)

樹可以用來表示物種之間的進化關係。一棵 進化樹 是乙個帶邊權的樹,其葉節點表示乙個物種,兩個葉節點之間的距離表示兩個物種的差異。現在,乙個重要的問題是,根據物種之間的距離,重構相應的 進化樹 令n 用乙個n上的矩陣m來定義樹t。其中,矩陣m滿足 對於任意的i,j,k,有m i,j m j,k m i...

Tyvj P1728 普通平衡樹 平衡樹

題目鏈結 p1728普通平衡樹 此為平衡樹系列第一道 普通平衡樹 1.插入x數 2.刪除x數 若有多個相同的數,因只刪除乙個 3.查詢x數的排名 若有多個相同的數,因輸出最小的排名 4.查詢排名為x的數 5.求x的前驅 前驅定義為小於x,且最大的數 6.求x的後繼 後繼定義為大於x,且最小的數 第一...

平衡查詢樹

在前面我們說了二叉查詢樹,它在最壞的情況下是很糟糕的。下面我們來說一種查詢樹,這種這查詢樹能夠保證無論如何構造它,它的執行時間都是對數級別的。理想情況下我們希望能夠保持二分查詢樹的平衡性。在一棵含有n個結點的樹中,我們希望樹的高度為lgn,這樣我們就能保證所有查詢能在lgn次比較內結束,就和二分查詢...