昨天晚上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 我也沒意見 替罪羊樹的主要思想...