BZOJ1756 小白逛公園

2022-05-06 23:51:10 字數 1761 閱讀 3267

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

一開始,小白就根據公園的風景給每個公園打了分-.-。小新為了省事,每次遛狗的時候都會事先規定乙個範圍,

小白只可以選擇第 a個和第 b 個公園之間(包括 a、 b兩個公園)選擇連續的一些公園玩。小白當然希望選出的公園的分數總和盡量高咯。

同時,由於一些公園的景觀會有所改變,所以,小白的打分也可能會有一些變化。

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

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

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

接下來 m行,每行三個整數。第乙個整數 k,1 或 2。

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

顯然的線段樹。

每個結點需要維護最大子段和,包含從左端點的最大子段和,包含右端點的最大子段和,然後討論吧

主要就是pushdown比較麻煩。

#includeusing

namespace

std;

const

int maxn = 500000 + 10

;typedef

long

long

ll;inline ll read()

while(ch<'

0'||ch>'9'

);

dowhile(ch>='

0'&&ch<='9'

);

return f*x;

}int

n,m;

inta[maxn];

struct

node

};node tree[maxn*4

];#define lc o<<1

#define rc o<<1|1inline

void pushup(int

o)inline

void build(int o,int l,int

r)

int mid=tree[o].mid();

build(lc,l,mid);

build(rc,mid+1

,r);

pushup(o);

}inline

void update(int o,int x,int

y)

int mid=tree[o].mid();

if(x<=mid)

update(lc,x,y);

else

update(rc,x,y);

pushup(o);

}inline node query(

int o,int x,int

y) }

}int

main()

if(k==2

)

}}

然後update裡腦抽寫錯一行,調了好久。。。

inline void update(int o,int x,int

y)

int mid=tree[o].mid();

if(x<=mid)

build(lc,x,y);//??!

else

build(rc,x,y);//??!

pushup(o);

}

我也不知道上面的**我是怎麼打出來的

1756 Vijos1083 小白逛公園

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

小白逛公園

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

小白逛公園

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