bzoj1251 序列終結者(伸展樹)

2021-07-29 17:07:54 字數 1784 閱讀 3826

description

網上有許多題,就是給定乙個序列,要你支援幾種操作: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。

input

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

output

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

sample input

4 41 1 3 2

1 2 4 -1

2 1 3

3 2 4

sample output

【資料範圍】

n<=50000,m<=100000。

題解:

splay練習題,建議先做noi2005維修數列。

#include

#include

#define inf 0x7fffffff

using

namespace

std;

inline

int read()

while(ch>='0'&&ch<='9')

return x*f;

}int n,m,sz,rt;

int fa[50005],c[50005][2],id[50005];

int tag[50005],v[50005],mx[50005],size[50005];

bool rev[50005];

inline

void pushup(int k)

void pushdown(int k)

if(r)

}if(rev[k])

}void rotate(int x,int &k)

fa[x]=z;fa[y]=x;fa[c[x][r]]=y;

c[y][l]=c[x][r];c[x][r]=y;

pushup(y);pushup(x);

}void splay(int x,int &k)

rotate(x,k);

}}int find(int k,int rank)

inline

int spilt(int l,int r)

inline

void update(int l,int r,int val)

inline

void rever(int l,int r)

inline

void query(int l,int r)

inline

void build(int l,int r,int f)

int mid=(l+r)>>1;now=id[mid];

build(l,mid-1,mid);build(mid+1,r,mid);

fa[now]=last;pushup(now);

if(mid0]=now;

else c[last][1]=now;

}int main()

}return

0;}

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。尤其是我們這裡的某人,出模擬試題,居然還出了一道這樣的,真是沒技術含量 這樣,我也出一道題,我出這一道的目的是為了讓大家以後做這種題目有乙個 庫 可以依靠,沒有什麼其他的意思...