洛谷4513 小白逛公園(線段樹)

2022-08-21 02:57:08 字數 921 閱讀 1297

題意。。。很明顯看出要維護區間子串行最大值,那麼問題就在於如何在區間合併的時候更新區間子串行最大值。

可以推出,區間子串行最大值要麼是從最左邊開始的一段,要麼是最右邊向左的一段,要麼是中間的一段,對於第一種,我們發現要麼是左兒子最左邊的一段,要麼是左兒子+右兒子左邊一段,第二種同理。

對於第三種,要麼是左兒子的最大值,要麼是右兒子的最大值,要麼是左兒子的右邊的一段與右兒子的左邊的一段拼起來。

然後就over啦

#includeusing namespace std;

const int maxn=5e5+10;

struct treetr[maxn<<2];

int n,m;

int scor[maxn];

void push_up(int root)

void build(int root,int l,int r)

int mid=l+r>>1;

build(root<<1,l,mid);

build(root<<1|1,mid+1,r);

push_up(root);

}void update(int root,int l,int r,int x,int key)

int mid=l+r>>1;

if(x<=mid)

update(root<<1,l,mid,x,key);

else

update(root<<1|1,mid+1,r,x,key);

push_up(root);

}tree query(int root,int l,int r)

int read()

int main()

else

update(1,1,n,l,r);

} return 0;

}

題解 洛谷P4513 小白逛公園(線段樹)

這裡要對某個葉子節點的值進行修改,最後求某一段區間內的某一段和的最大值,可以用線段樹來解決,但需要多開一些陣列儲存更多的資訊。我們定義ln陣列記錄某個結點從左開始某一段區間和的最大值,定義rn陣列為某個結點從右開始某一段區間和的最大值,定義midd陣列記錄某個結點在中間的某一段區間和的最大值,sum...

洛谷 P4513 小白逛公園

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

P4513 小白逛公園 線段樹

線段樹是一門比較刁鑽的手藝.此題我們需要維護 4 個變數 amx 代表當前節點的最大值.lmx 代表當前節點以左端點為起點的區間最大值.rmx 代表當前節點以右端點為結尾的區間最大值.sum 代表整段的和.然後我們在 push up 的時候,也是要做蠻多工作.lc 為左端點,rc 為右端點.lmx ...