小新經常陪小白去公園玩,也就是所謂的遛狗啦…
在小新家附近有一條「公園路」,路的一邊從南到北依次排著nn個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。
一開始,小白就根據公園的風景給每個公園打了分-.-。小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第aa個和第bb個公園之間(包括aa、bb兩個公園)選擇連續的一些公園玩。小白當然希望選出的公園的分數總和盡量高咯。同時,由於一些公園的景觀會有所改變,所以,小白的打分也可能會有一些變化。
那麼,就請你來幫小白選擇公園吧。
第一行,兩個整數nn和mm,分別表示表示公園的數量和操作(遛狗或者改變打分)總數。
接下來nn行,每行乙個整數,依次給出小白 開始時對公園的打分。
接下來mm行,每行三個整數。第乙個整數kk,11或22。
小白每出去玩一次,都對應輸出一行,只包含乙個整數,表示小白可以選出的公園得分和的最大值。
輸入 #1複製
5 3輸出 #1複製1 2 -3 4 5
1 2 3
2 2 -1
1 2 3
2-1求區間最長連續和
有時候區間合併用結構體線段樹要方便很多
#include#includeview codeusing
namespace
std;
struct
node
node[
4000005
];int n,m,k,x,y,cnt=0,a[500001
];void maintain(int x)//
維護更新,合併答案
void build(int l,int r,int
now)
int mid=(l+r)>>1
; node[now].lc=2*now;
build(l,mid,node[now].lc);
node[now].rc=2*now+1
; build(mid+1
,r,node[now].rc);
maintain(now);
//合併答案
}void update(int now,int to,int
num)
int mid=(x+y)>>1
;
if(to<=mid) update(node[now].lc,to,num);
else
update(node[now].rc,to,num);
maintain(now);
//合併答案
}node query(
int now,int l,intr)}
intmain()
else update(1
,x,y);
}return0;
}
P4513 小白逛公園 線段樹
線段樹是一門比較刁鑽的手藝.此題我們需要維護 4 個變數 amx 代表當前節點的最大值.lmx 代表當前節點以左端點為起點的區間最大值.rmx 代表當前節點以右端點為結尾的區間最大值.sum 代表整段的和.然後我們在 push up 的時候,也是要做蠻多工作.lc 為左端點,rc 為右端點.lmx ...
P4513 小白逛公園
小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n nn個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。一開始,小白就根據公園的風景給每個公園打了分 小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第a aa個和第b bb個公園...
題解 洛谷P4513 小白逛公園(線段樹)
這裡要對某個葉子節點的值進行修改,最後求某一段區間內的某一段和的最大值,可以用線段樹來解決,但需要多開一些陣列儲存更多的資訊。我們定義ln陣列記錄某個結點從左開始某一段區間和的最大值,定義rn陣列為某個結點從右開始某一段區間和的最大值,定義midd陣列記錄某個結點在中間的某一段區間和的最大值,sum...