luogu P3391 文藝平衡樹

2022-05-04 09:18:09 字數 925 閱讀 4087

qwq傳送門

要在splay中修改區間的話,可以先查詢size值為l與r+2的兩個節點,將乙個旋轉到根,另乙個旋轉到根的右兒子上,則要修改的區間就是根的右孩子的左子樹

然後直接打翻轉標記即可,翻轉標記類似於線段樹的懶標記,查第k大的時候pushdown,pushdown就是把左兒子,右兒子的位置交換

#include#define n 100005

using

namespace

std;

intn,m,tot,root;

struct

node

tree[n];

inline

void pushup(int

now)

inline

void pushdown(int

now)

}inline

void rotate(int

x)void splay(int x,int

goal)

if(!goal) root=x;

}inline

void insert(int

x) now=++tot;

tree[now].father=ff;

tree[ff].ch[x>tree[ff].val]=now; tree[now].val=x; tree[now].size=1

; splay(now,0);

}inline

int kth(int

x)

else

return

tree[now].val;

}}void write(int

now)

intmain()

write(root);

return0;

}

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...

Splay luogu P3391 文藝平衡樹

文藝平衡樹 一道大家熟知的splay區間翻轉模板題 基於splay的區間翻轉,我們要做的只有這些 1 像線段樹一樣打翻轉標記,不過由於翻轉是可以抵消的,所以可以採取位運算節省時間 2 翻轉只需要逐層翻轉即可,正確性已有論證 3 對於區間如何確定的問題,我們只需要將l 1節點旋至根,r 1節點旋至根下...