LGOJ4146 序列終結者 splay

2021-09-24 09:31:28 字數 2209 閱讀 4640

【題目描述】

網上有許多題,就是給定乙個序列,要你支援幾種操作:a、b、c、d。一看另一道題,又是乙個序列要支援幾種操作:d、c、b、a。尤其是我們這裡的某人,出模擬試題,居然還出了一道這樣的,真是沒技術含量……

這樣我也出一道題,我出這一道的目的是為了讓大家以後做這種題目有乙個「庫」可以依靠,沒有什麼其他的意思。

這道題目就叫序列終結者吧。

給定乙個長度為n的序列,每個序列的元素是乙個整數(廢話)。要支援以下三種操作:

最開始所有元素都是0。

【輸入格式】

第一行兩個整數n,m。m為操作個數。

以下m行,每行最多四個整數,依次為k,l,r,v。k表示是第幾種操作,如果不是第1種操作則k後面只有兩個數.

【輸出格式】

對於每個第3種操作,給出正確的回答。

s am

plei

nput

sample~~input

sample

inpu

t

4 4

1 1 3 2

1 2 4 -1

2 1 3

3 2 4

sam

pleo

utpu

tsample~~output

sample

outp

ut

【題意分析】

主要就是splay打標記,add和rev標記一起下傳。

提取區間的話,找一下l和r+2,然後把l旋到根,r+2旋到根的右子樹。

那麼很明顯根的右子樹的左子樹就是要提取的區間了(比l大,比r+2小,那麼就是先右子樹再左子樹)

code:

#include

#include

#include

#include

#include

#include

#define maxn 100000

#define inf 1 << 28

using

namespace std;

int data[maxn]

, n, m, sz, root;

struct spaly

inline

void pushadd (

int x,

int y)

inline

void pushrev (

int x)

inline

void pushdown (

int x)

if(rev[x])}

inline

void rotate (

int x)

inline

void splay (

int x,

int goal)if(

! goal) root = x;

}int kth (

int x,

int rank)

inline

int split (

int l,

int r)

inline

void add (

int l,

int r,

int k)

inline

void reverse (

int l,

int r)

inline

int query (

int l,

int r)

int build (

int l,

int r,

int fa)

int mid = l + r >>1;

son[mid][0

]= build (l, mid -

1, mid)

; son[mid][1

]= build (mid +

1, r, mid)

; val[mid]

= data[mid]

; father[mid]

= fa; maintain (mid)

;return mid;

}}tree;

int main ()if

(opt ==2)

if(opt ==3)

}return0;

}

FHQ Treap P4146 序列終結者

題意 給定乙個序列,支援區間加,區間反轉,區間max詢問 裸的平衡樹題,這裡採用fhq treap 每個節點多記錄乙個max值和兩個lazy tag,暴力push down即可 大常數選手 打完這道模板題可憐的leven就要去準備初賽了qwq 1 include2 define writeln x ...

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。尤其是...