Tyvj P1427 小白逛公園

2021-07-14 16:19:25 字數 1692 閱讀 5871

描述

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

輸出格式

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

輸入5 3

1 2 -3 4 5

1 2 3

2 2 -1

1 2 3

輸出2

-1 每個節點維護乙個left,right,mid,sum,分別表示 從左 / 從右 / 全部 開始的最大值 和 整個節點的和

這樣可以類似dp寫出轉移方程

當前sum=左兒子sum+右兒子sum

當前left=max{左兒子left,左兒子sum+右兒子left }

當前right=max{右兒子right,右兒子sum+左兒子right}

當前mid=max{左兒子mid,右兒子mid,左兒子right+右兒子left }

這樣每次更新出每個節點的各個值,ok

**資料裡面當輸入 1 a b 的時候有可能出現 a>b !!!

所以一定要swap過來**

#include

#include

using namespace std;

const int maxn=500000;

int n,m;

struct node

tree[4

*maxn+1];

inline void update(int num)

inline void chg(int l,int r,int num,int p,int

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

if(p<=mid)

chg(l,mid,2

*num,p,s);

else

chg(mid+1,r,2

*num+1,p,s);

update(num);

}inline node query(int l,int r,int num,int a,int b)

}int main()

for(int i=1;i<=m;i++)

else

}return

0;}

TYVJ 1427 小白逛公園

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

TYVJ 1427 小白逛公園 線段樹

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

小白逛公園

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