TYVJ 1427 小白逛公園 線段樹

2021-06-16 09:22:27 字數 3316 閱讀 9798

自從上一次線段樹寫掛了以後,心裡一直不爽!!!

線段樹都能寫掛。。。。

於是我又找了一些題。

因為臨近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個公園之間 包...