不會講解,直接上板子,按照洛谷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 輸出格式 輸出一...