替罪羊樹學習小記

2021-08-29 13:43:47 字數 2362 閱讀 3168

替罪羊樹是一種沒有旋轉操作的二叉搜尋樹。

或者說就是一顆二叉搜尋樹,暴力的那種。

插入就是自上而下找到應該插入的地方而後插進去。

我們知道這樣搞肯定是可以變成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 我也沒意見 替罪羊樹的主要思想...