BZOJ 1251 序列終結者 splay

2021-08-14 03:07:47 字數 1355 閱讀 8455

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。

不知道第幾次複習splay……這次又發現有幾個地方要注意:1、ins的時候必須把新加的點旋到根,否則就要一直往上更新。2、splay前要把x到根的標記下傳。3、不要亂動0這個點,包括mx、size等。

#include

using

namespace

std;

#define ll long long

#define pa pair

const

int maxn=50010;

const

int inf=2147483647;

ll read()

while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return x*f;

}int root,n,m,tot=0;

int fa[maxn],son[maxn][2],size[maxn],rev[maxn],d[maxn];

ll mx[maxn],lazy[maxn],val[maxn];

void up(int x)

void down(int x)

if(rev[x])

}void update(int x)

void rotate(int x)

void work(int x)

void splay(int x,int rt)

if(!rt)root=x;

}int find(int x)

return t;

}void ins(int x)

fa[t]=w;son[w][x>d[w]]=t;

up(w);splay(w,0);

}int find1(int x)

return t;

}int main()

else

if(op==2)rev[t]^=1;

else

printf("%lld\n",mx[t]);

}}

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