P3391 文藝平衡樹

2021-10-23 22:57:34 字數 1693 閱讀 1833

傳送門

功能:實現區間反轉

比如當前需要反轉 [ l , r ] ,那麼只需要把 l - 1 和 r + 1 分別旋到根節點,讓後根節點右子樹的左子樹就是 [ l , r ] 區間內的數,在上面加乙個 tag 懶標即可。

注意各個地方pushdown。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define x first

#define y second

#define l (u<<1)

#define r (u<<1|1)

#define mid (tr[u].l+tr[u].r>>1)

#define len(u) (tr[u].r-tr[u].l+1)

#define pb push_back

#define mk make_pair

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int n=

1000010

,mod=

1e9+

7,inf=

0x3f3f3f3f

;const

double eps=

1e-6

;struct splay

; node e[n]

;int idx;

int rot,a[n]

;void

update

(int x)

//更新當前結點sum

intidentify

(int x)

//確定當前結點是父親的左孩子還是右孩子

void

connect

(int x,

int f,

int son)

//x作為f的son(左右)兒子

void

pushdown

(int x)

//標記

}void

rotate_tree

(int x)

//旋轉節點

void

splay_tree

(int x,

int goal)

//伸展操作

intbuild_tree

(int l,

int r,

int fa)

//遞迴建樹

intfind_tree

(int v)

}return0;

}void

reverse

(int x,

int y)

void

dfs(

int now)

//輸出

void

solve()

dfs(rot);}

}s;int

main()

/**/

P3391 文藝平衡樹

維護序列,有若干翻轉操作,輸出最後序列 帶翻轉標記的平衡樹模板 在翻轉時,查詢第l 1大,和r 1大的元素 此時下標為權值 考慮到交換左右子樹對查詢樹性質的影響,所以不能直接查詢前驅後繼 在r ot at erotate rotate 操作,和查詢k kk大操作下傳標記即可 因為每個元素固定只有乙個...

P3391 文藝平衡樹

維護序列,有若干翻轉操作,輸出最後序列 帶翻轉標記的平衡樹模板 在翻轉時,查詢第l 1大,和r 1大的元素 此時下標為權值 考慮到交換左右子樹對查詢樹性質的影響,所以不能直接查詢前驅後繼 在ro tate rota te操作,和查詢k k大操作下傳標記即可 因為每個元素固定只有乙個,所以不用開cnt...

splay反轉 P3391 文藝平衡樹

首先你要理解splay的旋轉 其實反轉和treap是一樣的,都是二叉樹的旋轉 但是treap用隨機數來維護樹高,而slplay用雙旋來維護 那我們怎麼翻轉這個區間呢?對於l r 我們先把l 1旋轉到根節點 再把r 1旋轉到更節點的右兒子 顯然,這樣樹根的右子節的左子節點點是l r 那麼我們只要把這個...