BZOJ 1500 維修數列

2021-08-04 07:16:21 字數 2394 閱讀 4690

time limit: 10 sec  

memory limit: 64 mb

submit: 14433  

solved: 4701 [

submit][

status][

discuss]

輸入的第1 行包含兩個數n 和m(m ≤20 000),n 表示初始時數列中數的個數,m表示要進行的運算元目。

第2行包含n個數字,描述初始時的數列。

以下m行,每行一條命令,格式參見問題描述中的**。

任何時刻數列中最多含有500 000個數,數列中任何乙個數字均在[-1 000, 1 000]內。

插入的數字總數不超過4 000 000個,輸入檔案大小不超過20mbytes。

對於輸入資料中的get-sum和max-sum操作,向輸出檔案依次列印結果,每個答案(數字)佔一行。

9 82 -6 3 5 1 -5 -3 6 3

get-sum 5 4

max-sum

insert 8 3 -5 7 2

delete 12 1

make-same 3 3 2

reverse 3 6

get-sum 5 4

max-sum

-110110

submit][

status][

discuss]

home

back

終於a掉這道題了,調了快乙個小時...splay有個地方寫錯了導致rotate著的時候有乙個兒子掉了...其他就沒什麼好說的,因為這道題是splay裸題,算是**題(其實也不算太長).看一下**的update就能懂了怎麼求最大子段和了.

紀念一下:

runid

user

problem

result

memory

time

language

code_length

submit_time

2186510

maxmercer

1500

accepted

28184 kb

4360 ms

c++/edit

5492 b

2017-07-25 10:45:55

#include#includeusing namespace std;  

const int inf=(1<<29);

const int maxn=500005;

char ss[20];

int n,t,newone,tot,a[maxn],rev[maxn],tag[maxn],w[maxn],s[maxn],root;

int _recycle[maxn],_recycle_top,c[maxn][2],fa[maxn],siz[maxn],sum[maxn],lmax[maxn],rmax[maxn],ans[maxn];

inline const int read()

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

return f*x;

}inline int newnode()

inline void reverse(int x)

inline void replace(int x,int val)

inline void update(int x)

inline void pushdown(int x)

if(tag[x])

}inline void rotate(int x,int &_wanna)

inline void splay(int x,int &_wanna)

void build(int lf,int rg,int who)

if(lfmid)

update(who);

} int find(int k,int x)

inline void reverse(int x,int num)

inline void replace(int x,int num,int z)

void erase(int x)

inline void del(int x,int num)

inline void insert(int x,int num)

inline void init()

int main()

if(ss[0]=='d')

if(ss[4]=='-')

if(ss[0]=='r')

if(ss[0]=='g')

if(ss[2]=='x') printf("%d\n",ans[root]);

} return 0;

}

BZOJ 1500, 維修數列

傳送門 編寫乙個支援插入 刪除 修改 翻轉 求和以及求和最大子串行的資料結構。splay無疑。但是寫太醜也是會tle的,比方說插入的時候應該以建樹的形式插入,而不是乙個點乙個點的形式。實現起來要注意的細節很多,對練習打splay挺有好處。陸陸續續除錯了好多天,總算在崩潰之前ac了 include c...

bzoj 1500 維修數列

輸入的第1 行包含兩個數n 和m m 20 000 n 表示初始時數列中數的個數,m表示要進行的運算元目。第2行包含n個數字,描述初始時的數列。以下m行,每行一條命令,格式參見問題描述中的 任何時刻數列中最多含有500 000個數,數列中任何乙個數字均在 1 000,1 000 內。插入的數字總數不...

BZOJ1500 維修數列 splay

orz hzwer.lx x 表示x的子樹的中序遍歷的最左節點開始向右的最大和,可以在任意地方結束,rx x 表示x這棵子樹的中序遍歷最右節點開始向左的最大和。mx x 是這棵子樹的最大值,這樣就很好維護了。tag x 是這棵子樹被全部賦值的標記,rev x 是這棵子樹被反轉的標記 include ...