點此看題
最近學了無旋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
,n],對第二個區間打標記,然後暴力merge
\text
merge
即可。這裡用到了treap
\text
treap
打懶標記的思想,在split,merge
\text
split,merge
時都下傳標記,因為我們不考慮權值,所以我們下傳時直接交換左右兒子,最後答案時平衡樹的中序便利。
#include
#include
#include
#include
using
namespace std;
const
int maxn =
100005
;int
read()
int n,m,rt;
int ch[maxn][2
],siz[maxn]
,hp[maxn]
,fl[maxn]
;struct node
}emp;
voidup(
int x)
void
down
(int x)
node split
(int x,
int s)
else
up(x)
;return y;
}int
merge
(int x,
int y)
if(fl[y]
)down
(y);
ch[y][0
]=merge
(x,ch[y][0
]);up
(y);
return y;
}void
print
(int x)
intmain()
for(
int i=
1;i<=m;i++
)print
(rt)
;}
模板 文藝平衡樹
由於中序遍歷不會因為旋轉改變,平衡樹可以作為區間樹使用。翻轉用打標記的方法,splay x,y 代表把x接到以y為根的子樹下面。include include using namespace std const int maxn 100005 int n,m int val maxn siz max...
模板 文藝平衡樹
文藝平衡樹就是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...