(模板)Splay 平衡樹

2021-08-21 08:30:49 字數 1375 閱讀 2060

不會講解,直接上板子,按照洛谷p3369的要求

#include

#include

#include

using

namespace

std;

const

int maxn=1000000;

int ch[maxn][2],f[maxn],size[maxn],cnt[maxn],key[maxn];

int nodecnt,root;

void clear(int x)//清除(當這個點被刪除之後)

bool get(int x)//判斷是父節點的左節點還是右節點

void update(int x)//更新當前點以下的元素個數(發生修改以後更新)

}void rotate(int x)//旋轉

void splay(int x)//splay,不停地rotate直到滿足要求

void insert(int x)//插入

int now=root,fa=0;

while(1)

fa=now;

now=ch[now][key[now]if (now==0)

}}int find(int x)//查詢x的排名(排名定義為比當前數小的數的個數 +1+1 。若有多個相同的數,應輸出最小的排名)

ans+=cnt[now];

now=ch[now][1];}}

}int findx(int x)//尋找排名為x的數

}}int pre()//求 xx 的前驅(前驅定義為小於 xx ,且最大的數),注意這個數不一定在樹中

//注意,查詢某個數的前驅後驅時,要先把這個數插進樹中,然後把這個數轉到根節點(insert中已整合),

//求x的前驅其實就是求x的左子樹的最右邊的乙個結點,後繼是求x的右子樹的左邊乙個結點,求完後要刪除這個點

int next1()//求 xx 的後繼(後繼定義為大於 xx ,且最小的數)

void del(int x)//刪除值為x的節點

if (!ch[root][0]&&!ch[root][1])

if (!ch[root][0])

else

if (!ch[root][1])

int leftbig=pre(),oldroot=root;

splay(leftbig);

ch[root][1]=ch[oldroot][1];

f[ch[oldroot][1]]=root;

clear(oldroot);

update(root);

} int main()

else

if(j==2)

else

if(j==3)

平衡樹 Splay 模板

又是 機房最後乙個學spl ay splay splay的人 參考d al ao dalao dalao部落格 寫的非常好!最後放上我的 有個地方應該寫ch root 0 ch root 0 ch roo t 0 手殘寫成ch root 1 ch root 1 ch roo t 1 還查不出來t t...

文藝平衡樹(splay模板)

題幹 splay模板,要求維護區間反轉。splay是一種碼量小於treap,但支援排名,前驅後繼等treap可求的東西,也支援區間反轉的平衡樹。但是有兩個壞處 1.splay常數遠遠大於treap以及stl中的set。2.沒有可持久化splay,但有可持久化treap。下面是 1.pushup以及p...

模板 文藝平衡樹(Splay)

這是一道經典的splay模板題 文藝平衡樹。輸入格式 第一行為n,m n表示初始序列有n個數,這個序列依次是 1,2,cdots n 1,n 1,2,n 1,n m表示翻轉操作次數 接下來m行每行兩個數 l,r l,r 資料保證 1 leq l leq r leq n1 l r n 輸出格式 輸出一...