小新經常陪小白去公園玩,也就是所謂的遛狗啦…在小新家附近有一條「公園路」,路的一邊從南到北依次排著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的整數。
小白每出去玩一次,都對應輸出一行,只包含乙個整數,表示小白可以選出的公園得分和的最大值。
5 3
1 2 -3 4 5
1 2 3
2 2 -1
1 2 3
copy
2
-1
copy
各個測試點2s
解:線段樹;
e陣列維護lsum,rsum,msum,sum;
開三個結構體:tl,tr,tt;
tl:左邊對應的情況;
tr:同上;
tt:即為答案;
#include#includevijos 1083#include
#define ll long long
using
std::max;
using
std::swap;
const
int n=500010
;struct
node
e[n<<2
];#define ls ro<<1
#define rs ro<<1|1inline
void pushup(int
ro)void build(int ro,int l,int
r)
int mid=(l+r)>>1
; build(ls,l,mid);
build(rs,mid+1
,r);
pushup(ro);
}void change(int ro,int x,int
p)
int mid=(e[ro].l+e[ro].r)>>1
;
if(x<=mid) change(ls,x,p);
else
change(rs,x,p);
pushup(ro);
}node query(
int ro,int l,intr)
}int
main()
else
}return0;
}
Vijos1083 小白逛公園
description 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n 個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。一開始,小白就根據公園的風景給每個公園打了分 小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第a個和第...
vijos1083 小白逛公園
題目 題意 求區間最大連續子段和,有單點修改 s um sumsu m表示區間和,l ll表示包含左端點的最大連續子段和,r rr表示包含右端點的最大連續子段和,a ll allal l表示整個區間的最大連續子段和 include using namespace std const int n 50...
1756 Vijos1083 小白逛公園
題目鏈結 題目大意 區間最大子段和,多次詢問 題解 維護一些東西 lm從左端點往右能取到的最大值 rm從右節點往左能取到的最大值 ans儲存當前區間任取一段的最大值 上傳標記的時候比較麻煩,詳見 詢問返回節點,因為這樣才能保證查詢時資訊的合併不出問題 我的收穫 include include usi...