注意:1,記憶體限制,所以需要**刪除的點
2,當前節點的左連續區間和最大值=max(左子樹的左連續區間和最大值,左子樹的總和+當節點的值+max(右子樹的左連續區間和最大值,0));右連續區間和最大值同理
當前節點的區間和最大值=max(左子樹的區間和最大值,max(右子樹的區間和最大值,max(左子樹的右連續區間和最大值,0)+max(右子樹的左連續區間和最大值,0)+當前節點的值))
3,pushdown時,應該交換左子樹的左連續區間和最大值與左子樹的右連續區間和最大值。因為向上更新時這兩個值的不同對結果有影響,不能延遲更新。
1 #include2 #include3 #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 內。插入的數字總數不...