BZOJ 1251 序列終結者

2021-08-14 08:27:46 字數 2212 閱讀 1910

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

給定乙個長度為

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

1. 將[l

,r]這個區間內的所有數加上

v 。

2. 將[l

,r]這個區間翻轉,比如12

34變成43

21。

3. 求[l

,r] 這個區間中的最大值。 最開始所有元素都是

0 。

第一行兩個整數n,

m 。

m為操作個數。 以下m

行,每行最多四個整數,依次為k,

l ,r,

v 。

k表示是第幾種操作,如果不是第

1 種操作則

k後面只有兩個數。

對於每個第

3 種操作,給出正確的回答。

4 4

1 1 3 2

1 2 4 -1

2 1 3

3 2 4

n<=50000,m<=100000。

splay。

區間反轉和區間加?打標記,標記下傳需要注意一下。

求最大值?splay每個節點維護乙個最大值,注意更新。

#include 

const

int maxn=100000;

int n;

struct splay_tree

if(son[0][x])

if(son[1][x])

lazy[x]=0;

return

0; }

inline

int updata(int x)

}if(son[1][x])

}return

0; }

inline

int t(int x)

inline

int rotate(int x)

fa[x]=fa[f];

if(son[!k][x])

son[k][f]=son[!k][x];

fa[f]=x;

son[!k][x]=f;

updata(f);

updata(x);

return

0; }

inline

int splay(int x,int c)

else

if(t(x)==t(f))

else

}if(!c)

return

0; }

inline

int build(int l,int r)

if(mid+1

<=r)

updata(mid);

return mid;

} inline

int getkth(int x)

else

if(size[son[0][now]]+1

0][now]]+1;

now=son[1][now];

}else

}return

0; }

inline

int addnode(int x,int v)

inline

int add(int l,int r,int v)

else

}else

else

}return

0; }

inline

int reverse(int l,int r)

else

}else

else

}return

0; }

inline

int getmax(int l,int r)

else

}else

else

}}};

splay_tree st;

int m,k,l,r,v;

int main()

else

if(k==2)

else

}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 序列終結者

題意 給定含有n個0的的數列。1.區間加值 2.區間翻轉 3.區間求最大值 演算法 平衡樹 fhq treap 需要特別注意的是 1.使0點對全域性無影響並全程保持 例如求max,t 0 mx inf 2.平衡樹和線段樹的上傳區別在於要考慮本身這個點。include include include ...