題目在這裡呀~
1、單點修改
2、求區間[l,r]內的最大子串行
做法還算好想吧(如果做過類似題目
比如poj 的 hotel ?好像沒什麼差別的。
就是一棵線段樹每個節點要記四個值:左端點連續的和最大值,右端點連續的和的最大值,區間和,區間最大子串行和。
注意點:
1、在求和時因為這個詢問區間是拼起來的,所以在query時返回最好是結構體,以便合併。(不用的話不知道怎麼做qwq)
2、pushup中左端點的連續和最大值為左兒子的連續和最大值或者左兒子的和+右兒子的左端點連續和最大值,其他也是乙個道理。
大概就這兩點是比較重要的吧tat(有時間就寫一下哦~)
//suplex
#include
#include
#include
#include
#include
#define n 2000000
#define segment_tree st
using
namespace
std;
int n,m,opt,x,y;
struct stt[n+n+n+n];
inline
void pushup(st &rt,st lson,st rson)
rt.mx=max(rt.mx,max(lson.mx,rson.mx));
rt.ls=max(lson.ls,lson.s+rson.ls);
rt.rs=max(rson.rs,rson.s+lson.rs);
rt.s=lson.s+rson.s;
}void build(int rt,int l,int r)
int mid=(l+r)>>1;
build(rt+rt,l,mid);
build(rt+rt+1,mid+1,r);
pushup(t[rt],t[rt+rt],t[rt+rt+1]);
}void modify(int rt,int l,int r,int x,int delta)
int mid=(l+r)>>1;
if(x<=mid) modify(rt+rt,l,mid,x,delta);
else modify(rt+rt+1,mid+1,r,x,delta);
pushup(t[rt],t[rt+rt],t[rt+rt+1]);
}st query(int rt,int l,int r,int x,int y)
}int main()
else modify(1,1,n,x,y);
}return
0;}
小白逛公園
描述 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去哪些公園玩了。一開始,小白就根據公園的風景給每個公園打了分 小新為了省事,每次遛狗的時候都會事先規定乙個範圍,小白只可以選擇第a個和第b個公園之間 包括a...
小白逛公園
小白逛公園 time limit 20000ms memory limit 65536k case time limit 2000ms description 小新經常陪小白去公園玩,也就是所謂的遛狗啦 在小新家附近有一條 公園路 路的一邊從南到北依次排著n個公園,小白早就看花了眼,自己也不清楚該去...
題解 小白逛公園
標籤 線段樹 給定乙個區間,兩種操作 操作1 查詢區間內最大子段和 操作2 單點修改。暴力查詢區間最大子段和時間複雜度是 o n 的,一定會 觀察資料範圍,正解的時間複雜度大約是 log 級別的。再根據單點修改,可以嘗試一下線段樹。單點修改好做,關鍵在於區間查詢最大子段和。主要工作在於線段樹的合併。...