小白逛公園

2021-06-28 19:05:48 字數 1705 閱讀 4523

描述

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

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

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

格式輸入格式

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

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

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

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

輸出格式

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

樣例輸入1

5 31 2 -3 4 5

1 2 3

2 2 -1

1 2 3

樣例輸出12-1

題解:這道題沒做出來啊……雖然寫了很長時間,但最後還是會崩棧,但前面的幾個點是過了的。還是發上來吧。老規矩,解析在注釋裡。

code:

#include

#include

#include

using namespace std;

struct noteshu[4000100]; //別問我為啥用shu,我覺得shu比tree字母少 

void change(int now,int left,int right,int p,int t)//now代表當前節點的編號,left,right左右邊界,p是要修改的位置,t是要修改的值 

int m=(left+right)>>1;

if (p<=m) change(now<<1,left,m,p,t);

else change((now<<1)+1,m+1,right,p,t); //修改操作 

//維護 

shu[now].sum=shu[now<<1].sum+shu[(now<<1)+1].sum;

shu[now].l=max(shu[now<<1].l,shu[now<<1].sum+shu[(now<<1)+1].l);

shu[now].r=max(shu[now<<1].r+shu[(now<<1)+1].sum,shu[(now<<1)+1].r);

shu[now].ans=max(shu[now<<1].r+shu[(now<<1)+1].l,max(shu[now<<1].ans,shu[(now<<1)+1].ans)); 

} note ask(int now,int left,int right,int a,int b)

int main()

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

note output=ask(1,1,n,a,b); 

printf("%d\n",output.ans);}}

return 0; 

}

小白逛公園

小白逛公園 time limit 20000ms memory limit 65536k case time limit 2000ms description 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去...

題解 小白逛公園

標籤 線段樹 給定乙個區間,兩種操作 操作1 查詢區間內最大子段和 操作2 單點修改。暴力查詢區間最大子段和時間複雜度是 o n 的,一定會 觀察資料範圍,正解的時間複雜度大約是 log 級別的。再根據單點修改,可以嘗試一下線段樹。單點修改好做,關鍵在於區間查詢最大子段和。主要工作在於線段樹的合併。...

線段樹 小白逛公園

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