模板 文藝平衡樹

2021-08-20 17:58:00 字數 1591 閱讀 2591

由於中序遍歷不會因為旋轉改變,平衡樹可以作為區間樹使用。

翻轉用打標記的方法,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...