洛谷 P4513 小白逛公園

2022-05-28 03:33:12 字數 2174 閱讀 6354

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

在小新家附近有一條「公園路」,路的一邊從南到北依次排著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思路:不得不說這個題是乙個好題,而且加深了我對線段樹的理解,讓我知道了線段樹還能這麼用。

其實這個題沒想象中的難,個人感覺藍題左右,難度不到紫題,洛谷評分虛高了一點。我這裡用了乙個技巧,用l表示區間左端點嚴格為線段樹節點區間左端點的子串行最大值,r同理

s則是區間左右端點不加以限制的最大值(也就是題目要的答案)。顯然線段樹在合併資訊的時候,l的值為:max,r同理,s則為

max(想想為什麼),然後按正常的線段樹操作做即可。

沒想象中的難。

1 #include2 #include3 #include4 #include5

using

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 ...