BZOJ 1251 序列終結者(Splay)

2022-05-18 21:32:45 字數 2232 閱讀 7659

網上有許多題,就是給定乙個序列,要你支援幾種操作:a、b、c、d。一看另一道題,又是乙個序列要支援幾種操作:d、c、b、a。尤其是我們這裡的某人,出模擬試題,居然還出了一道這樣的,真是沒技術含量……這樣 我也出一道題,我出這一道的目的是為了讓大家以後做這種題目有乙個「庫」可以依靠,沒有什麼其他的意思。這道題目 就叫序列終結者吧。【問題描述】 給定乙個長度為n的序列,每個序列的元素是乙個整數(廢話)。要支援以下三種操作: 1. 將 [l, r] 這個區間內的所有數加上 v。 2. 將 [l,r] 這個區間翻轉,比如 1 2 3 4 變成 4 3 2 1。3. 求 [l,r] 這個區間中的最大值。最開始所有元素都是 0。

第一行兩個整數 n,m。m 為操作個數。以下 m 行,每行最多四個整數,依次為 k, l, r, v。k 表示是第幾種操作,如果不是第 1 種操作則 k 後面只有兩個數。對於每個第3種操作,給出正確的回答。

【資料範圍】n<=50000,m<=100000。

這題還真不能用 線段樹 做,splay 是乙個不錯的選擇

對於操作 1 將所有 [l, r] 中的數加上乙個常量,可以對 splay 樹中的節點增加乙個 add 域,表示以該節點為根中序遍歷所得的數列中每個數要增加 add,每次執行的時候,先將 l-1 旋轉到根,再把 r+1 旋轉成根的兒子節點,那麼,[l, r] 區間的數列就在 r+1 的左子樹中了,對 r+1 的左兒子執行更新操作即可,類似於線段樹的懶操作

對於操作 2 將所有 [l, r] 中的數翻轉,可以對 splay 樹中的節點增加乙個 rev 域,表示以該節點為根中序遍歷所得的數列是否需要翻轉,更新的時候還是和操作 1 一樣,將 l-1 旋轉到根,r+1 旋轉成為 l-1 的孩子,直接對 r+1 的左兒子更新

對於操作 3,增加乙個 max 域,表示以該節點為根中序遍歷得到的數列中最大值是多少,詢問時,將 l-1 旋轉到根,r+1 旋轉成 l-1 的孩子,詢問 r-1 的左兒子的 max 即可

這裡說一點細節:由於是維護數列,且涉及到區間翻轉操作,所以還要增加乙個 size 域,表示以它為根的中序遍歷得到的數列的個數是多少,用它來實現數列中的定位

由於涉及到翻轉和統一加權操作,pushdown 和 pushup 操作一定要想好在哪些地方需要執行

1 #include 2 #include 3 #include 4

5using

namespace

std;67

const

int n=100005, inf=0x7fffffff;8

9struct

splay_tree

17} t[n];

18int

fa[n], root;

1920

void pushup(int

x) 26

if(t[x].son[1

]) 30}31

32void pushdown(int

x) 40

if(t[x].son[1

]) 45 t[x].add=0;46

}47if(t[x].rev) 53}

5455

void rotate(int x, int

kind)

6263

void splay(int x, int

goal) 75}

76pushup(x);

77if(goal==0) root=x;78}

7980

int select(int

pos)

89pushdown(u);90}

91return

u;92}93

94void update(int l, int r, int

val)

102103

void reverse(int l, int

r) 109

110int query(int l, int

r) 116

117int build(int l, int

r) 127

128void init(int

n) 134

};135

136splay_tree hehe;

137138

intmain()

148else

if(a==2

) 152

else

156}

157return0;

158 }

bzoj 1251

bzoj 1251 序列終結者

bzoj 1251 序列終結者

題目在這裡 這應該是splay裸題了吧。對於每個節點儲存5個值,size,max,flag,lazy,val 分別表示這個節點的子樹大小,子樹的最大值,子樹是否有打過翻轉標記,子樹的增加的值,前面的所有都包括這個節點它自己 以及這個節點的當前值。對於一段區間 l,r 的詢問 修改,只需把l 1這個節...

bzoj1251 序列終結者

time limit 20 sec memory limit 162 mb submit 2971 solved 1188 submit status discuss 網上有許多題,就是給定乙個序列,要你支援幾種操作 a b c d。一看另一道題,又是乙個序列 要支援幾種操作 d c b a。尤其是...

BZOJ 1251 序列終結者

網上有許多題,就是給定乙個序列,要你支援幾種操作 a b c d。一看另一道題,又是乙個序列,要支援幾種操作 d c b a。尤其是我們這裡的某人,出模擬試題,居然還出了一道這樣的,真是沒技術含量 這樣,我也出一道題,我出這一道的目的是為了讓大家以後做這種題目有乙個 庫 可以依靠,沒有什麼其他的意思...