BZOJ 1500 維修數列 Splay

2022-04-11 02:02:19 字數 2458 閱讀 3782

注意:1,記憶體限制,所以需要**刪除的點

2,當前節點的左連續區間和最大值=max(左子樹的左連續區間和最大值,左子樹的總和+當節點的值+max(右子樹的左連續區間和最大值,0));右連續區間和最大值同理

當前節點的區間和最大值=max(左子樹的區間和最大值,max(右子樹的區間和最大值,max(左子樹的右連續區間和最大值,0)+max(右子樹的左連續區間和最大值,0)+當前節點的值))

3,pushdown時,應該交換左子樹的左連續區間和最大值與左子樹的右連續區間和最大值。因為向上更新時這兩個值的不同對結果有影響,不能延遲更新。

1 #include2 #include

3 #include4

using

namespace

std;

5const

int n=500100;6

const

int inf=0x7fffffff;7

intdata[n],fa[n],id,root;

8int

size[n],sum[n],a[n];

9int t[n][2

],st[n],top;

10int

mxl[n],mxr[n],mxm[n];

11int

same[n],flip[n];

12void re(int

x);13 inline void pushup(int

x)22 inline void pushdown(int

x)31

if(r)35}

36if(same[x]!=-inf)

42if

(r)47 same[x]=-inf;48}

49}50void rotate(int x,int

w)61

void splay(int x,int

y)70

pushup(x);

71if(!y)root=x;72}

7374}75

void newnode(int &x,int y,int

v)86

void build(int &x,int y,int l,int

r)94}95

void init(int

n)105

int select(int

k)115

return

x;116

}117

void insert(int c,int

n)121

int cc=select(c+1

);122 c=select(c);

123 splay(c,0

);124

splay(cc,c);

125 build(t[cc][0],cc,1

,n);

126pushup(cc);

127pushup(c);

128}

129void recall(int

x)135

}136

void delete(int l,int

r)146

void flip(int l,int

r)154

void same(int l,int r,int

v) 166

int sum(int l,int

r)173

int max(int l,int

r)178

void

de()

182}

183void re(int

x)189

}190

intmain()

203if(!strcmp(op,"

max-sum"))

206if(!strcmp(op,"

insert"))

210if(!strcmp(op,"

delete"))

214if(!strcmp(op,"

make-same"))

218if(!strcmp(op,"

reverse"))

222}

223}

224return0;

225}

226/*

2279 8

228229

2 -6 3 5 1 -5 -3 6 3

230231

get-sum 5 4

232233

max-sum

234235

insert 8 3 -5 7 2

236237

delete 12 1

238239

make-same 3 3 2

240241

reverse 3 6

242243

get-sum 5 4

244245

max-sum

246*/

BZOJ 1500, 維修數列

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

BZOJ 1500 維修數列

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個數字,描述初...

bzoj 1500 維修數列

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