小新經常陪小白去公園玩,也就是所謂的遛狗啦…
在小新家附近有一條「公園路」,路的一邊從南到北依次排著nn個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。
一開始,小白就根據公園的風景給每個公園打了分-.-。小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第aa個和第bb個公園之間(包括aa、bb兩個公園)選擇連續的一些公園玩。小白當然希望選出的公園的分數總和盡量高咯。同時,由於一些公園的景觀會有所改變,所以,小白的打分也可能會有一些變化。
那麼,就請你來幫小白選擇公園吧。
第一行,兩個整數nn和mm,分別表示表示公園的數量和操作(遛狗或者改變打分)總數。
接下來nn行,每行乙個整數,依次給出小白 開始時對公園的打分。
接下來mm行,每行三個整數。第乙個整數kk,11或22。
小白每出去玩一次,都對應輸出一行,只包含乙個整數,表示小白可以選出的公園得分和的最大值。
輸入 #1複製
5 31 2 -3 4 5
1 2 3
2 2 -1
1 2 3
輸出 #1複製
2-1思路:不得不說這個題是乙個好題,而且加深了我對線段樹的理解,讓我知道了線段樹還能這麼用。
其實這個題沒想象中的難,個人感覺藍題左右,難度不到紫題,洛谷評分虛高了一點。我這裡用了乙個技巧,用l表示區間左端點嚴格為線段樹節點區間左端點的子串行最大值,r同理
s則是區間左右端點不加以限制的最大值(也就是題目要的答案)。顯然線段樹在合併資訊的時候,l的值為:max,r同理,s則為
max(想想為什麼),然後按正常的線段樹操作做即可。
沒想象中的難。
1 #include2 #include3 #include4 #include5using
namespace
std;
6const
int n = 5e5 + 5;7
struct
segtr[n << 2
];11
intn, m, num[n];
12#define ls p << 1
13#define rs p << 1|1
14#define inf 2e9
15void update(int
p)16
22void build(int p, int l, int
r)23
34int mid = l + r >> 1;35
build(ls, l, mid);
36 build(rs, mid + 1
, r);
37update(p);38}
39void modify_set(int p, int pos, int
v)40
49int mid = tr[p].l + tr[p].r >> 1;50
if(pos <=mid) modify_set(ls, pos, v);
51else
modify_set(rs, pos, v);
52update(p);53}
54 seg query(int p, int l, int
r)55
60int mid = tr[p].l + tr[p].r >> 1
;61 seg lz = (seg);
62 seg rz = (seg);
63seg ret;
64if(l <= mid) lz =query(ls, l, r);
65if(r > mid) rz =query(rs, l, r);
66 ret.sum = lz.sum +rz.sum;
67 ret.l = max(lz.l, lz.sum +rz.l);
68 ret.r = max(rz.r, rz.sum +lz.r);
69 ret.s = max(max(lz.s, rz.s), lz.r +rz.l);
70return
ret;71}
72int
main()
7387
else modify_set(1
, a, b);88}
89return0;
90 }
P4513 小白逛公園
小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n nn個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。一開始,小白就根據公園的風景給每個公園打了分 小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第a aa個和第b bb個公園...
題解 洛谷P4513 小白逛公園(線段樹)
這裡要對某個葉子節點的值進行修改,最後求某一段區間內的某一段和的最大值,可以用線段樹來解決,但需要多開一些陣列儲存更多的資訊。我們定義ln陣列記錄某個結點從左開始某一段區間和的最大值,定義rn陣列為某個結點從右開始某一段區間和的最大值,定義midd陣列記錄某個結點在中間的某一段區間和的最大值,sum...
P4513 小白逛公園 線段樹
線段樹是一門比較刁鑽的手藝.此題我們需要維護 4 個變數 amx 代表當前節點的最大值.lmx 代表當前節點以左端點為起點的區間最大值.rmx 代表當前節點以右端點為結尾的區間最大值.sum 代表整段的和.然後我們在 push up 的時候,也是要做蠻多工作.lc 為左端點,rc 為右端點.lmx ...