題意。。。很明顯看出要維護區間子串行最大值,那麼問題就在於如何在區間合併的時候更新區間子串行最大值。
可以推出,區間子串行最大值要麼是從最左邊開始的一段,要麼是最右邊向左的一段,要麼是中間的一段,對於第一種,我們發現要麼是左兒子最左邊的一段,要麼是左兒子+右兒子左邊一段,第二種同理。
對於第三種,要麼是左兒子的最大值,要麼是右兒子的最大值,要麼是左兒子的右邊的一段與右兒子的左邊的一段拼起來。
然後就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 ...