字尾平衡樹可以支援前端加字元,以平衡樹的形式維護字尾的排名,\(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次比較內結束,就和二分查詢...