HNOI2017單旋
阿新 • • 發佈:2018-01-27
class urn bool ace tree pla ons define 所有
單旋
- 這道題做法賊多,LCT,splay,線段樹什麽的貌似都行。
- 像我這種渣渣只會線段樹了(
高級數據結構學了也不會用)。 - 首先離線所有操作,因為不會有兩個點值重復,所以直接離散。
- 一顆線段樹來維護所有點的深度,並將所有值丟進\(set\)中。
- 插入操作,在set找到前驅後繼,前驅沒有右兒子就放前驅右兒子,否則放後繼左兒子,同時用\(ch\)和\(fa\)假裝模擬樹的形態。
- 旋轉操作,在\(set\)裏找到節點,可以發現旋轉操作該點兒子深度不變,其他點深度加一,處理一下父子關系,然後線段樹修改區間即可。
刪除操作,先旋轉操作,\(root\)一定只有一個兒子,直接刪掉\(root\)即可,將所有點深度減一
// luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; typedef int sign; typedef long long ll; #define For(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i) #define Fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i) const int N=1e5+5; bool cmax(sign &a,sign b){return
HNOI2017單旋