自從上一次線段樹寫掛了以後,心裡一直不爽!!!
線段樹都能寫掛。。。。
於是我又找了一些題。
因為臨近noip了,就找了點簡單題,難的沒寫出來,除錯要花好久。。
我一旦做的題目錯了,就會一直找錯,直到3~4天都沒發現才會放棄,浪費好多時間,於是不敢找難的
這個題目是動態求區間最大連續和,算是一道基本線段樹吧= - =
只要記錄從左邊開始的最大值maxl,右邊開始的最大值maxr,區間中的最大值max以及區間和sum
建樹時,maxl[k]:=max maxr[k]:=max;
max[k]:=max;
然後修改時,思路一樣,找到改的點,然後對從根到該節點所有路徑做一遍建樹的操作即可。
求答案時,我用了幾個變參記錄孩子在所給區間的maxl maxr max 以及sum (和陣列不一樣)用來更改本身節點的相應值,和建樹時差不多。
= - =還有乙個注意點,就是 會有讀入x y y
code:(寫的有點醜和長了= - =。。我覺得work和change能合在一起,然後邊讀入邊change,但是這樣時間會多一點。。)
varmaxl,maxr,sum,max,zuo,you,a:array[0..1100000] of longint;
z,ss,n,m,i,k,x,y,ll,rr,mm:longint;
function mx(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
procedure work(k,l,r:longint);
varm:longint;
begin
zuo[k]:=l;
you[k]:=r;
if (l=r) then
begin
max[k]:=a[l];
maxl[k]:=a[l];
maxr[k]:=a[l];
sum[k]:=a[l];
exit;
end;
m:=(l+r) div 2;
work(k*2,l,m);
work(k*2+1,m+1,r);
max[k]:=mx(max[k*2],max[k*2+1]);
max[k]:=mx(max[k],maxr[k*2]+maxl[k*2+1]);
maxl[k]:=mx(maxl[k*2],sum[k*2]+maxl[k*2+1]);
maxr[k]:=mx(maxr[k*2+1],sum[k*2+1]+maxr[k*2]);
sum[k]:=sum[k*2]+sum[k*2+1];
end;
procedure find(k,u,v:longint;var ll,rr,mm,ss:longint);
varm,l,r,ll1,ll2,rr1,rr2,ss1,ss2,mm1,mm2:longint;
begin
l:=zuo[k];r:=you[k];
if (l>=u) and (r<=v) then
begin
ll:=maxl[k];
rr:=maxr[k];
mm:=max[k];
ss:=sum[k];
exit;
end;
m:=(l+r) div 2;
ll:=-maxlongint;rr:=-maxlongint;mm:=-maxlongint;ss:=-maxlongint;
ll1:=-maxlongint;rr1:=-maxlongint;mm1:=-maxlongint;ss1:=-maxlongint;
ll2:=-maxlongint;rr2:=-maxlongint;mm2:=-maxlongint;ss2:=-maxlongint;
if (u<=m) then find(k*2,u,v,ll1,rr1,mm1,ss1);
if (v>m) then find(k*2+1,u,v,ll2,rr2,mm2,ss2);
if (ll1>-maxlongint) and (ll2=-maxlongint) then
begin
ll:=ll1;
rr:=rr1;
mm:=mm1;
ss:=ss1;
end;
if (ll1=-maxlongint) and (ll2>-maxlongint) then
begin
ll:=ll2;
rr:=rr2;
mm:=mm2;
ss:=ss2;
end;
if (ll1>-maxlongint) and (ll2>-maxlongint) then
begin
ll:=mx(ll1,ss1+ll2);
rr:=mx(rr2,ss2+rr1);
mm:=mx(mm1,mm2);
mm:=mx(mm,rr1+ll2);
ss:=ss1+ss2;
end;
end;
procedure change(k,x,y:longint);
varl,r,m:longint;
begin
l:=zuo[k];
r:=you[k];
if (l=x) and (l=r) then
begin
max[k]:=y;
maxl[k]:=y;
maxr[k]:=y;
sum[k]:=y;
exit;
end;
m:=(l+r) div 2;
if x<=m then change(k*2,x,y);
if x>m then change(k*2+1,x,y);
max[k]:=mx(max[k*2],max[k*2+1]);
max[k]:=mx(max[k],maxr[k*2]+maxl[k*2+1]);
maxl[k]:=mx(maxl[k*2],sum[k*2]+maxl[k*2+1]);
maxr[k]:=mx(maxr[k*2+1],sum[k*2+1]+maxr[k*2]);
sum[k]:=sum[k*2]+sum[k*2+1];
end;
begin
read(n,m);
for i:=1 to n do
read(a[i]);
work(1,1,n);
for i:=1 to m do
begin
read(k);
if k=1 then
begin
read(x,y);
if y
TYVJ 1427 小白逛公園
描述 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。一開始,小白就根據公園的風景給每個公園打了分 小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第a個和第b個公園之間 包括a...
Tyvj P1427 小白逛公園
描述 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。一開始,小白就根據公園的風景給每個公園打了分 小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第a個和第b個公園之間 包括a...
線段樹 小白逛公園
題目描述 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。一開始,小白就根據公園的風景給每個公園打了分 小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第a個和第b個公園之間 包...