洛谷P4513 小白逛公园 (线段树)
这道题看起来像是线段树和最大子段和的结合,但这里求最大子段和不用dp,充分利用线段树递归的优势来处理。个人理解:线段树相当于把求整个区间的最大子段和的问题不断划分为很多个小问题,容易解决小问题,然后递归处理较大的问题(分治),所以这就可以用来解决。
在线段树中,除了左端点,右端点,新开4个域——ans,ml,mr,sum,其中sum为该区间的和,ans为该区间上的最大子段和,ml为必须包含左端点(以左端点为头)的最大子段和,mr为必须包含右端点(以右端点为尾)的最大子段和。
更新操作在up()中,应该容易看懂,需要思考的是查询操作,他返回的是一个结构体类型,该操作相当于针对某个询问的区间来更新结果,最后的query().ans也就是答案了
1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const int N=5e5+10;
5 int n,m;
6 struct node{
7 int l,r;
8 ll ml,mr,sum,ans;
9 }t[N<<2];
10
11 void up(int k){
12 t[k].sum=t[k<<1].sum+t[k<<1|1].sum;
13 t[k].ml=max(t[k<<1].ml,t[k<<1].sum+t[k<<1|1].ml);
14 t[k].mr=max(t[k<<1|1].mr,t[k<<1|1].sum+t[k<<1].mr);
15 t[k].ans=max(max(t[k<<1].ans,t[k<<1|1].ans),t[k<<1].mr+t[k<<1|1].ml);
16 }
17
18 void build(int k,int l,int r){
19 t[k].l=l,t[k].r=r;
20 if(l==r){
21 scanf("%lld",&t[k].sum);
22 t[k].ml=t[k].mr=t[k].ans=t[k].sum;
23 return ;
24 }
25 int mid=(l+r)>>1;
26 build(k<<1,l,mid);build(k<<1|1,mid+1,r);
27 up(k);
28 }
29
30 node query(int k,int l,int r){
31 if(t[k].l>=l && t[k].r<=r) return t[k];
32 int mid=(t[k].l+t[k].r)>>1;
33 if(r<=mid) return query(k<<1,l,r);
34 else if(l>mid) return query(k<<1|1,l,r);
35 else{
36 node t,a=query(k<<1,l,r),b=query(k<<1|1,l,r);
37 t.sum=a.sum+b.sum;
38 t.ml=max(a.ml,a.sum+b.ml);
39 t.mr=max(b.mr,b.sum+a.mr);
40 t.ans=max(max(a.ans,b.ans),a.mr+b.ml);//合并
41 return t;
42 }
43 }
44
45 void change(int k,int p,int x){//将p位置上的数改为x
46 if(t[k].l==t[k].r && t[k].l==p){
47 t[k].ml=t[k].mr=t[k].ans=t[k].sum=x;
48 return ;
49 }
50 int mid=(t[k].l+t[k].r)>>1;
51 if(p<=mid) change(k<<1,p,x);
52 else change(k<<1|1,p,x);
53 up(k);
54 }
55
56 int main(){
57 scanf("%d%d",&n,&m);
58 build(1,1,n);
59 while(m--){
60 int opt,a,b;
61 scanf("%d%d%d",&opt,&a,&b);
62 if(opt==1){
63 if(a>b) swap(a,b);
64 printf("%lld\n",query(1,a,b).ans);
65 }
66 else change(1,a,b);
67 }
68 }
洛谷P4513 小白逛公园 (线段树)的更多相关文章
- 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...
- 2018.07.23 洛谷P4513 小白逛公园(线段树)
传送门 线段树常规操作了解一下. 单点修改维护区间最大连续和. 对于一个区间,维护区间从左端点开始的连续最大和,从右端点开始的连续最大和,整个区间最大和,区间和. 代码如下: #include< ...
- P4513 小白逛公园 (线段树)
题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...
- 洛谷P4513 小白逛公园
区间最大子段和模板题.. 维护四个数组:prefix, suffix, sum, tree 假设当前访问节点为cur prefix[cur]=max(prefix[lson],sum[lson]+pr ...
- Bzoj 1756: Vijos1083 小白逛公园 线段树
1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1021 Solved: 326[Submit][Statu ...
- Vijos 1083 小白逛公园(线段树)
线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). ----------- ...
- [vijos]1083小白逛公园<线段树>
描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公 ...
- [日常摸鱼]Vijos1083小白逛公园-线段树
题意:单点修改,询问区间最大子段和,$n\leq 5e5$ 考虑分治的方法$O(nlogn)$求一次最大子段和的做法,我们是根据中点分成左右两个区间,那么整个区间的答案要么是左边答案,要么是右边答案, ...
- 洛谷 P3373 【模板】线段树 2
洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...
随机推荐
- Str 真题解(置换)
目录 题面 置换 这里没有群论 置换 置换的乘法(复合) 置换乘法的单位元 置换乘法的结合律 置换快速幂 置换求乘法逆 真题解 一种可能的代码实现 关于循环节做法 题面 对于字符串 \(s\) 定义一 ...
- spring boot实现不同生产环境下的文件配置
配置不同生产环境 本文适用于开发环境下需要打包项目至生产环境,避免开发环境的配置文件泄露. 设置maven 作用:1. 手动调节运行时的不同环境 2. 打包时可以不会有其它环境的文件 注:每次换环境前 ...
- js实现全屏弹框
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Java开发学习(二十二)----Spring事务属性、事务传播行为
一.事务配置 上面这些属性都可以在@Transactional注解的参数上进行设置. readOnly:true只读事务,false读写事务,增删改要设为false,查询设为true. timeout ...
- P4315 月下“毛景树”(树链剖分)
P4315 月下"毛景树"(树链剖分) 题面 简述: 边权转点权(在dfs1处转换) 把一条边权赋值在深度更深的上 需要实现对单边权的染色 , 路径边权的染色 , 路径边权的增加 ...
- Git 06 分支
参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 概述 分支用 ...
- 对DDD使用的一些建议
群里经常看到类似于"看了DDD之后就不会写代码了"的情况,趁最近学车的间隙,写写我的看法. 关于这个事儿,我是觉得:当没有DDD的时候,如果你知道怎么做,那就那么做好了,不要考虑D ...
- [CF1500C] Matrix Sorting (模拟)
场上最后十几秒交上去过掉了耶! 题面 这里有两个 N ∗ M N*M N∗M 的 E x c e l \rm Excel Excel 表格 A A A 和 B B B. 我们知道 E x c e l ...
- QPainter. QpaintDevice 绘图设备
QPaintDevice 绘图设备 1 QPixmap QImage Qbitmap(黑白色) QPicture QWidget 2 QPixmap 对不同平台做了显示优化 fill(填充颜色) Q ...
- KFS replicator安装(KES-KES)
源端 一.安装前置配置 1.创建安装用户 groupadd flysync useradd flysync -g flysync -G kingbase passwd flysync 2.上传安装文件 ...