替罪羊樹學習日記

2022-02-03 14:08:19 字數 1960 閱讀 4013

昨天晚上wq學長講課,講完讓人略微懵逼的kd-tree,學長心血來潮要講替罪羊樹

學長:儘管這個玩意又臭又長,但是我從學會一直打到了退役,你們今天晚上和明天上午可以不看板子自己yy一下

一向乖巧聽話(人慫膽小)的我覺得學長說得對啊,然後第二天早上我欣然開始了替罪羊樹之旅,並不知道後面等著我的是什麼

剛開始非常順利得碼完,和ce抗衡取得成功,然後輸入樣例,re

然後發現插入時沒處理根,改了之後成功通過樣例,提交,wa10,經測驗發現資料有樣例。。。。。。

高興(?)地調啊調啊調,終於得到了40分的好成績,然後經過和隨機資料生成的艱苦鬥爭,終於發現前趨後繼死活查不對

中午和*****一起******,開心

下午上網查發現這個玩意沒有很好的查前趨方法,最優(bao)美(li)的只有

我@#%$@#$#^#$@#$%@#

碼完成功ac

替罪羊樹,聽上去好像很高大上,但研究後發現替罪羊樹的核心是看似極度暴力的操作:重建

一棵bst,在連續插入遞增權值時可能退化成一條鏈,之前我們都是通過旋轉等操作使之始終保持平衡,

這裡我們換乙個思路,每次插入&刪除後進行檢查,發現不平衡直接重建整個子樹

很容易發現我們每次要盡量在靠上的節點為根開始重建

又由於每次插入以及刪除只對一條鏈有影響,掃這條鏈就好了

#includeusing

namespace

std;

inline

intread()

while(ch>='

0'&&ch<='

9') a=(a<<3)+(a<<1)+ch-'

0',ch=getchar();

return a*f;

}struct

node*rt=null,pool[1000100

];int tot,que[500100],top,qus[500100

];inline node* new(const

intval)

inline

void up(node *x)

}const

double arf=0.75,re=0.3

;inline

void dfs(node *x)

void chs(const

int l,const

int r,node *&now,node *fa)

inline

void change(node *x,node *fa)

bool t=fa->ch[1]==x;

chs(

1,top,fa->ch[t],fa);

}inline

void check(const

intval)

for(node *now=rt,*fa=null;now!=null&&now->val!=val;fa=now,now=now->ch[val>now->val])

if(now!=rt)

if((now->ch[1]!=null&&now->ch[1]->rs>=arf*now->rs+3

)) }

}inline

void insert(const

intval)

for(node *now=rt,*fa=null;;fa=now,now=now->ch[val>now->val])

if(val==now->val)

}}inline

int rnk(const

intval)

}inline node* kth(intk)}

inline

void dlt(const

intval)

}int

main()}}

替罪羊模板

替罪羊樹學習小記

替罪羊樹是一種沒有旋轉操作的二叉搜尋樹。或者說就是一顆二叉搜尋樹,暴力的那種。插入就是自上而下找到應該插入的地方而後插進去。我們知道這樣搞肯定是可以變成o n o n o n 的深度其複雜度的保證依賴於重構。即一棵子樹不平衡直接提出來重構成完全二叉樹。不平衡的定義為 m ax siz x0 siz ...

替罪羊樹學習筆記

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

替罪羊樹學習筆記

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