P3391 文藝平衡樹

2021-09-12 18:38:24 字數 1232 閱讀 9786

維護序列, 有若干翻轉操作, 輸出最後序列

帶翻轉標記的平衡樹模板

在翻轉時, 查詢第l-1大, 和r+1大的元素 (此時下標為權值)

( 考慮到交換左右子樹對查詢樹性質的影響, 所以不能直接查詢前驅後繼 )

在r ot

at

erotate

rotate

操作, 和查詢k

kk大操作下傳標記即可

因為每個元素固定只有乙個, 所以不用開cnt陣列

輸出時直接輸出中序遍歷即可

#include

#define reg register

const

int maxn =

100005

;int n, m, node_num, rot;

int ch[maxn][2

];int key[maxn]

, par[maxn]

, tag[maxn]

, size[maxn]

;inline

intchk

(int x)

void

push_down

(int k)

inline

void

push_up

(int k)

void

rotate

(int x)

void

splay

(int x,

int aim =0)

rotate

(x);}if

(!aim) rot = x;

}void

insert

(int x)

void

find

(int x)

ints_pre

(int x,

short opt)

intkth

(int k,

int tmp)

return k;

}void

reverse

(int l,

int r)

void

print

(int k)

intmain()

print

(rot)

;return0;

}

P3391 文藝平衡樹

傳送門 功能 實現區間反轉 比如當前需要反轉 l r 那麼只需要把 l 1 和 r 1 分別旋到根節點,讓後根節點右子樹的左子樹就是 l r 區間內的數,在上面加乙個 tag 懶標即可。注意各個地方pushdown。include include include include include in...

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 那麼我們只要把這個...