bzoj1756 Vijos1083 小白逛公園

2021-06-22 12:49:41 字數 1964 閱讀 7418

小新經常陪小白去公園玩,也就是所謂的遛狗啦…在小新家附近有一條「公園路」,路的一邊從南到北依次排著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 32-1

有一點坑的線段樹……你需要特殊的寫**技巧

每個線段樹節點要儲存幾個資料:lm從左節點往右能取到的最大值,rm從右節點往左能取到的最大值。ans儲存當前區間任取一段的最大值

因為是單點更新,所以連lazy tag也不需要,精華在於詢問和標記上傳的函式

上傳標記的時候要更新好多東西:

區間和tot:最簡單,左邊加右邊

lm:可以取左邊的一整段加右邊的lm,或者只取左邊的lm。lm=max(左邊的tot+右邊的lm,左邊的lm)

rm:可以取右邊的一整段加左邊的rm,或者只取右邊的rm。rm=max(右邊的tot+左邊的rm,右邊的rm)

ans:可以取更新完的當前的lm、rm,或者取左邊的rm加右邊的lm

然後詢問的時候函式的返回值要是乙個線段樹的節點而不只是乙個資料答案

因為從左右轉移的時候,你不知道這個答案是從左邊的rm還是ans轉移而來,右邊也是

具體來說,如果左邊從rm轉移而來,那麼它可以和右邊的lm合併,而ans不能保證會「緊貼「在區間的右邊,就不能和右邊的lm合併

所以要返回乙個線段樹的節點,然後一切都簡單了

#includeinline int read()

while(ch>='0'&&ch<='9')

return x*f;

}inline void swap(int &a,int &b)

inline int max(int a,int b)

struct treestree[2000001];

int n,m,a[500001],treesize;

inline void update(int k)

inline void buildtree(int l,int r)

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

tree[now].ls=treesize+1;

buildtree(l,mid);

tree[now].rs=treesize+1;

buildtree(mid+1,r);

update(now);

}inline trees ask(int k,int l,int r)

}inline void change(int k,int to,int dat)

int mid=(x+y)>>1;

if (to<=mid)change(tree[k].ls,to,dat);

if (to>mid)change(tree[k].rs,to,dat);

update(k);

}int main()

else change(1,y,z);

}return 0;

}

BZOJ1756 Vijos1083 小白逛公園

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

1756 Vijos1083 小白逛公園

題目鏈結 題目大意 區間最大子段和,多次詢問 題解 維護一些東西 lm從左端點往右能取到的最大值 rm從右節點往左能取到的最大值 ans儲存當前區間任取一段的最大值 上傳標記的時候比較麻煩,詳見 詢問返回節點,因為這樣才能保證查詢時資訊的合併不出問題 我的收穫 include include usi...

BZOJ1756 小白逛公園

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