qwq傳送門
要在splay中修改區間的話,可以先查詢size值為l與r+2的兩個節點,將乙個旋轉到根,另乙個旋轉到根的右兒子上,則要修改的區間就是根的右孩子的左子樹
然後直接打翻轉標記即可,翻轉標記類似於線段樹的懶標記,查第k大的時候pushdown,pushdown就是把左兒子,右兒子的位置交換
#include#define n 100005using
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節點旋至根下...