線段樹 小白逛公園

2021-06-03 04:54:00 字數 2397 閱讀 8400

題目描述

小新經常陪小白去公園玩,也就是所謂的遛狗啦…在小新家附近有一條「公園路」,路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。

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

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

輸入格式

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

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

接下來m行,每行三個整數。第乙個整數k,1或2。k=1表示,小新要帶小白出去玩,接下來的兩個整數a和b給出了選擇公園的範圍(1≤a,b≤n);k=2表示,小白改變了對某個公園的打分,接下來的兩個整數p和s,表示小白對第p個公園的打分變成了s(1≤p≤n)。

其中,1≤n≤500 000,1≤m≤100 000,所有打分都是絕對值不超過1000的整數。

輸出格式

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

樣例輸入

5 31 2 -3 4 5

1 2 3

2 2 -1

1 2 3

樣例輸出

2-1

一道線段樹的入門題。

用四個標記維護每個節點的狀態:

tree[p].maxl表示該區間內包含最左端元素的最大和;

tree[p].maxr表示該區間內包含最右端元素的最大和;

tree[p].sum表示該區間的綜合;

tree[p].maxs表示該區間的最大子區間和。

那麼每個p節點的狀態與其左子樹lc和右子樹rc的關係為:

tree[p].maxl = max(lc.maxl, lc.sum + rc.maxl);

tree[p].maxr = max(rc.maxr, rc.sum + lc.maxr);

tree[p].sum = lc.sum + rc.sum;

tree[p].maxs = max(lc.maxs, rc.maxs,

lc.maxr + rc.maxl)。

具體細節建程式。

accode:

#include #include #include #include using std::max;

const char fi = "rqnoj626.in";

const char fo = "rqnoj626.out";

const int maxn = 500010;

const int maxm = 100010;

const int max = 0x3fffff00;

const int min = -max;

struct segtree

;segtree tree[maxn << 2];

int sc[maxn];

int n, m, tot;

void init_file()

void update(segtree *ths, segtree *lc, segtree *rc)

//根據左子樹lc和右子樹rc更新ths節點的狀態。

void build(int l, int r)

//若到葉節點則直接賦初始打分並返回。

int mid = (l + r) >> 1;

if (l < r)

update(tree + now, tree + tree[now].lc,

tree + tree[now].rc);

//根據左右子樹的資訊更新當前節點。

} void modify(int now, int p)

//邊界,若找到p則直接修改。

int mid = (tree[now].l + tree[now].r) >> 1;

if (p <= mid) modify(tree[now].lc, p);

//若p在左區間則修改左子樹。

if (p > mid) modify(tree[now].rc, p);

//若p在右區間則修改右子樹。

update(tree + now, tree + tree[now].lc,

tree + tree[now].rc);

//更新當前節點。

} segtree find(int now, int l, int r)

//返回在now節點,區間[l, r]中找到最優狀態。

void work()

}}

int main()

TYVJ 1427 小白逛公園 線段樹

自從上一次線段樹寫掛了以後,心裡一直不爽!線段樹都能寫掛。於是我又找了一些題。因為臨近noip了,就找了點簡單題,難的沒寫出來,除錯要花好久。我一旦做的題目錯了,就會一直找錯,直到3 4天都沒發現才會放棄,浪費好多時間,於是不敢找難的 這個題目是動態求區間最大連續和,算是一道基本線段樹吧 只要記錄從...

P4513 小白逛公園 線段樹

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

P4513 小白逛公園 線段樹

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