time limit: 20 sec memory limit: 162 mb
submit: 2817 solved: 1125
[submit][status][discuss]
網上有許多題,就是給定乙個序列,要你支援幾種操作: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種操作,給出正確的回答。
4 41 1 3 2
1 2 4 -1
2 1 3
3 2 4
2【資料範圍】
n<=50000,m<=100000。
splay
source好像已經說了是平衡樹
有三種操作,區間加,於是我們給每個點加乙個"lazy-lable",tag[i]表示以i為根的子樹中每個點+tag[i](注意val[i]即i的權值已經加了tag[i]);區間反轉,實質上就是將區間的左右子樹反轉,然而對於每次詢問或修改,若不涉及到未翻轉的子樹,那麼操作並沒有什麼影響,所以給每個點再加乙個rev[i],rev[i]=1表示以i為根的左右子樹需反轉,每次操作將rev[i]^=1。對於
區間最值,維護乙個mx[i],表示以i為根的子樹的最大值,每次旋轉時或區間加時更新。
不要忘記mx[0]=-inf!v可能為負。
#include#include#include
#include
#include
#include
#define inf 1000000000
using
namespace
std;
intn,m,cnt,root;
int fa[50005],tree[50005][2],id[50005
];int tag[50005],val[50005],mx[50005],size[50005
];bool rev[50005
];inline
intread()
while (c>='
0'&&c<='
9')
return a*f;
}inline
void pushup(int
k)inline
void pushdown(int
k)
if (tree[k][1])
}if(rev[k])
}inline
void rotate(int x,int &k)
inline
void splay(int x,int &k)
rotate(x,k);
}}int find(int k,int
x)inline
void update(int l,int r,int
v)inline
void build(int l,int r,int
f) now=id[mid];
build(l,mid-1,mid); build(mid+1
,r,mid);
fa[now]=last; pushup(now);
if (mid0]=now; else tree[last][1]=now;
}inline
void query(int l,int
r)inline
void rever(int l,int
r)int
main()
if (f==2
) rever(l,r);
if (f==3
) query(l,r);
}return0;
}
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。尤其是我們這裡的某人,出模擬試題,居然還出了一道這樣的,真是沒技術含量 這樣,我也出一道題,我出這一道的目的是為了讓大家以後做這種題目有乙個 庫 可以依靠,沒有什麼其他的意思...