模板 文藝平衡樹

2022-03-13 05:22:26 字數 1887 閱讀 4172

文藝平衡樹就是splay,維護區間反轉,就是把所有左變成右,打個標記就好啦.一開始智障判斷是否為根節點的時候傻乎乎的判斷是否等於0...刪了就好啦!

題幹:

題目描述43

21,翻轉區間是[2,4]的話,結果是5 234

1輸入輸出格式

輸入格式:

第一行為n,m n表示初始序列有n個數,這個序列依次是(

1,2,⋯n−1,n) (1,2, \cdots n-1,n)(1,2,⋯n−1

,n) m表示翻轉操作次數

接下來m行每行兩個數 [l,r][l,r][l,r] 資料保證

1≤l≤r≤n 1 \leq l \leq r \leq n 1

≤l≤r≤n

輸出格式:

輸出一行n個數字,表示原始序列經過m次變換後的結果

**:

#include#include

#include

#include

#include

#include

#include

#define b cout << "breakpoint!" << endl;

#define o(a) cout << #a << " " << a << endl;

using

namespace

std;

#define duke(i,a,n) for(register int i = a;i <= n;i++)

#define lv(i,a,n) for(register int i = a;i >= n;i--)

#define clean(a) memset(a,0,sizeof(a))

const

int inf = 1

<< 30

;typedef

long

long

ll;typedef

double

db;template

void read(t &x)

int n,m,tot = 0

;int root = 0

;struct

node

}e[200010

];//

#define root e[1].ch[1]

inline void update(int

x)inline

void pushdown(intx)}

inline

int iden(int

x)inline

void connect(int x,int f,int

son)

inline

void rotate(int

x)/*

inline void splay(int at,int to)

else

}if(to == 0) root =at;

//cout<}

inline

void insert(int

x) u = ++tot;

//cout e[ff].v] =u;

e[u].init(x,ff);

splay(u,0);

}inline

int kth(int

k)

else

}}void write(int

u)inline

void work(int l,int

r)int

main()

*/while(m--)

*/}/*puts("");

duke(i,1,n + 2)

*/write(root);

puts(

"");

return0;

}

模板 文藝平衡樹

由於中序遍歷不會因為旋轉改變,平衡樹可以作為區間樹使用。翻轉用打標記的方法,splay x,y 代表把x接到以y為根的子樹下面。include include using namespace std const int maxn 100005 int n,m int val maxn siz max...

模板 文藝平衡樹

點此看題 最近學了無旋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模板)

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