P3391 文藝平衡樹(Splay做法)

2022-06-18 02:36:09 字數 1001 閱讀 9622

您需要寫一種資料結構(可參考題目標題),來維護乙個有序數列。

其中需要提供以下操作:翻轉乙個區間,例如原有序序列是 5\ 4\ 3\ 2\ 154321,翻轉區間是 [2,4][2,4] 的話,結果是 5\ 2\ 3\ 4\ 152341。

#includeusing

namespace

std;

const

int maxn=1e5+100

;const

int inf=1e9;

intn,m;

struct

splay_tree t[maxn];

introot,tot;

void update (int

x) void pushdown (int

x) }

void rotate (int

x) void splay (int x,int

s)

if (s==0) root=x;

}void find (int

x) void ins (int

x)

if(u)

t[u].cnt++;

else

splay(u,

0);

}int next (int x,int

f)

void del (int

x)

else

t[nxt].ch[

0]=0;}

int kth (int

x)

else

if (t[y].size>=x)

u=y;

else

return

t[u].v;

}}void reverse (int l,int

r) void dfs (int

u) int

main ()

dfs(root);

}

splay反轉 P3391 文藝平衡樹

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

P3391 文藝平衡樹

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

P3391 文藝平衡樹

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