luogu P4253 小白逛公園

2021-08-20 09:24:48 字數 1352 閱讀 9980

題目在這裡呀~

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 級別的。再根據單點修改,可以嘗試一下線段樹。單點修改好做,關鍵在於區間查詢最大子段和。主要工作在於線段樹的合併。...