由於中序遍歷不會因為旋轉改變,平衡樹可以作為區間樹使用。
翻轉用打標記的方法,splay(x,y)代表把x接到以y為根的子樹下面。
#include
#include
using
namespace
std;
const
int maxn=100005;
int n,m;
int val[maxn],siz[maxn],mk[maxn];
int ch[maxn][2],fa[maxn];
int root,tot;
inline
int newnode(int x)
inline
bool check(int x)
inline
void pushup(int x)
inline
void pushdown(int x)
void rotate(int x)
void splay(int x,int y)
void insert(int x)
int cur=root,f=0;
while(1)
f=cur;cur=ch[cur][x>val[cur]];
if(!cur)
}}int kth(int x)
}}void rev(int x,int y)
void print(int cur)
int main()
print(root);
return
0;}
建樹可以構造一棵非常平衡的二叉樹
#include
#include
using
namespace
std;
const
int inf=1
<<30;
const
int maxn=100005;
int n,m;
int val[maxn],siz[maxn],mk[maxn];
int ch[maxn][2],fa[maxn];
int root,tot;
inline
int newnode(int x)
inline
bool check(int x)
inline
void pushup(int x)
inline
void pushdown(int x)
}void rotate(int x)
void splay(int x,int y)
bool insert(int x)
}}int kth(int x)
}}void rev(int x,int y)
void print(int cur)
int a[maxn];
int build(int pre,int l,int r)
int main()
print(root);
return
0;}
模板 文藝平衡樹
點此看題 最近學了無旋treap text treap 那就用它來水一發吧。反轉區間我們不考慮權值,一開始直接用merge text merge 插入,修改時直接split text split 出三個區間 1,l 1 l,r r 1,n 1,l 1 l,r r 1,n 1,l 1 l r r 1 ...
模板 文藝平衡樹
文藝平衡樹就是splay,維護區間反轉,就是把所有左變成右,打個標記就好啦.一開始智障判斷是否為根節點的時候傻乎乎的判斷是否等於0.刪了就好啦 題幹 題目描述43 21,翻轉區間是 2,4 的話,結果是5 234 1輸入輸出格式 輸入格式 第一行為n,m n表示初始序列有n個數,這個序列依次是 1,...
文藝平衡樹(splay模板)
題幹 splay模板,要求維護區間反轉。splay是一種碼量小於treap,但支援排名,前驅後繼等treap可求的東西,也支援區間反轉的平衡樹。但是有兩個壞處 1.splay常數遠遠大於treap以及stl中的set。2.沒有可持久化splay,但有可持久化treap。下面是 1.pushup以及p...