替罪羊樹是一種沒有旋轉操作的二叉搜尋樹。
或者說就是一顆二叉搜尋樹,暴力的那種。
插入就是自上而下找到應該插入的地方而後插進去。
我們知道這樣搞肯定是可以變成o(n
)o(n)
o(n)
的深度其複雜度的保證依賴於重構。
即一棵子樹不平衡直接提出來重構成完全二叉樹。
不平衡的定義為:
m ax
(siz
[x0]
,siz
[x1]
)>si
z[x]
∗α
max(siz[x0],siz[x1])>siz[x]*\alpha
max(si
z[x0
],si
z[x1
])>si
z[x]
∗αα
\alpha
α一般取0.75
0.75
0.75
沒有旋轉的話刪除會比較麻煩,需要找到左子樹最右的點或右子樹最左的點來替代,再把那個點刪掉,所以這叫替罪羊樹。
複雜度o(n
logn
)o(nlogn)
o(nlog
n),天知道為什麼
code:
#include
#include
#define al 0.75
#define x0 t[x][0]
#define x1 t[x][1]
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define max(a, b) ((a) > (b) ? (a) : (b))
using namespace std;
const
int n =
1e5+5;
int q, n, rt, op, x, t[n][2
], siz[n]
, a[n]
, fa[n]
;int d[n]
, d0;
intlr
(int x)
void
upd(
int x)
void
ins(
int&x,
int k)
int z = a[k]
> a[x]
;ins
(t[x]
[z], k)
; fa[t[x]
[z]]
= x;
upd(x);}
intpd
(int x)
void
rec(
int x)
intdg
(int l,
int r)
intft
(int x,
int k)
intfr
(int x)
intfl
(int x)
void
del(
int x)
int p = x0 ? x0 : x1, y = fa[x]
, z =
lr(x)
; fa[t[y]
[z]= p]
= y;
for(x = y; x; x = fa[x]
)upd
(x);
if(x == rt) rt = p;
}intgn(
int x,
int k)
intfn
(int x,
int k)
intgl
(int x,
int k)
intgr
(int x,
int k)
const
int inf =
2147483647
;int
main()
}if(op ==2)
del(
ft(rt, x));
if(op ==3)
printf
("%d\n",gn
(rt, x));
if(op ==4)
printf
("%d\n"
, a[
fn(rt, x +1)
]);if
(op ==5)
printf
("%d\n"
, a[
gl(rt, x)])
;if(op ==6)
printf
("%d\n"
, a[
gr(rt, x)])
;}}
替罪羊樹學習日記
昨天晚上wq學長講課,講完讓人略微懵逼的kd tree,學長心血來潮要講替罪羊樹 學長 儘管這個玩意又臭又長,但是我從學會一直打到了退役,你們今天晚上和明天上午可以不看板子自己yy一下 一向乖巧聽話 人慫膽小 的我覺得學長說得對啊,然後第二天早上我欣然開始了替罪羊樹之旅,並不知道後面等著我的是什麼 ...
替罪羊樹學習筆記
教練講旋轉的時候摸魚去了,然後就不會旋轉操作了t t,那怎麼辦呢,要做題的啊,誒,替罪羊樹好像是不用旋轉的誒qwq,就它了。替罪羊樹這樣直接講不直觀,還是看題來講吧。上題 洛谷 p3369 模板 普通平衡樹 概念 思想 替罪羊樹屬於平衡樹的一種,但是他維護平衡的方式不是複雜的旋轉,而是直接把這棵子樹...
替罪羊樹學習筆記
部落格咕咕咕了好久 最近會逐步繼續恢復更新部落格的。最近又在學習二叉搜尋樹。實測發現替罪羊樹快的飛起 時間約splay的1 2 寫起來還比較簡單,決定來一波。那為什麼還要用splay呢?因為splay是序列之王!還能維護lct!你要用非旋treap fhq treap 我也沒意見 替罪羊樹的主要思想...