P4513 小白逛公園 線段樹

2022-05-01 13:51:11 字數 1461 閱讀 6608

小新經常陪小白去公園玩,也就是所謂的遛狗啦…

在小新家附近有一條「公園路」,路的一邊從南到北依次排著nn個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。

一開始,小白就根據公園的風景給每個公園打了分-.-。小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第aa個和第bb個公園之間(包括aa、bb兩個公園)選擇連續的一些公園玩。小白當然希望選出的公園的分數總和盡量高咯。同時,由於一些公園的景觀會有所改變,所以,小白的打分也可能會有一些變化。

那麼,就請你來幫小白選擇公園吧。

第一行,兩個整數nn和mm,分別表示表示公園的數量和操作(遛狗或者改變打分)總數。

接下來nn行,每行乙個整數,依次給出小白 開始時對公園的打分。

接下來mm行,每行三個整數。第乙個整數kk,11或22。

小白每出去玩一次,都對應輸出一行,只包含乙個整數,表示小白可以選出的公園得分和的最大值。

輸入 #1複製

5 3

1 2 -3 4 5

1 2 3

2 2 -1

1 2 3

輸出 #1複製

2

-1求區間最長連續和

有時候區間合併用結構體線段樹要方便很多

#include#include

using

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;

}

view code

P4513 小白逛公園 線段樹

線段樹是一門比較刁鑽的手藝.此題我們需要維護 4 個變數 amx 代表當前節點的最大值.lmx 代表當前節點以左端點為起點的區間最大值.rmx 代表當前節點以右端點為結尾的區間最大值.sum 代表整段的和.然後我們在 push up 的時候,也是要做蠻多工作.lc 為左端點,rc 為右端點.lmx ...

P4513 小白逛公園

小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n nn個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。一開始,小白就根據公園的風景給每個公園打了分 小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第a aa個和第b bb個公園...

題解 洛谷P4513 小白逛公園(線段樹)

這裡要對某個葉子節點的值進行修改,最後求某一段區間內的某一段和的最大值,可以用線段樹來解決,但需要多開一些陣列儲存更多的資訊。我們定義ln陣列記錄某個結點從左開始某一段區間和的最大值,定義rn陣列為某個結點從右開始某一段區間和的最大值,定義midd陣列記錄某個結點在中間的某一段區間和的最大值,sum...