这道题看起来像是线段树和最大子段和的结合,但这里求最大子段和不用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 小白逛公园 (线段树)的更多相关文章

  1. 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)

    P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...

  2. 2018.07.23 洛谷P4513 小白逛公园(线段树)

    传送门 线段树常规操作了解一下. 单点修改维护区间最大连续和. 对于一个区间,维护区间从左端点开始的连续最大和,从右端点开始的连续最大和,整个区间最大和,区间和. 代码如下: #include< ...

  3. P4513 小白逛公园 (线段树)

    题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...

  4. 洛谷P4513 小白逛公园

    区间最大子段和模板题.. 维护四个数组:prefix, suffix, sum, tree 假设当前访问节点为cur prefix[cur]=max(prefix[lson],sum[lson]+pr ...

  5. Bzoj 1756: Vijos1083 小白逛公园 线段树

    1756: Vijos1083 小白逛公园 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1021  Solved: 326[Submit][Statu ...

  6. Vijos 1083 小白逛公园(线段树)

    线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). ----------- ...

  7. [vijos]1083小白逛公园<线段树>

    描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公 ...

  8. [日常摸鱼]Vijos1083小白逛公园-线段树

    题意:单点修改,询问区间最大子段和,$n\leq 5e5$ 考虑分治的方法$O(nlogn)$求一次最大子段和的做法,我们是根据中点分成左右两个区间,那么整个区间的答案要么是左边答案,要么是右边答案, ...

  9. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

随机推荐

  1. python shutil相关操作

    python shutil模块常用操作 高级的 文件.文件夹.压缩包 处理模块 1.将文件内容拷贝至另一个文件中 shutil.copyfileobj(src, dist, length=16*102 ...

  2. iframe 标签

    iframe是一个内联框架,可以在当前HTML页面中嵌入另一个文档,一般情况下使用iframe直接在页面嵌套iframe标签再指定src就可以了. iframe 的常用属性: name : 规定 &l ...

  3. React报错之Object is possibly null

    正文从这开始~ 类型守卫 使用类型守卫来解决React中useRef钩子"Object is possibly null"的错误.比如说,if (inputRef.current) ...

  4. Vue 基本列表 && 数据过滤与排序

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...

  5. Nginx 浏览器缓存配置指令

    # 浏览器缓存 # 当浏览器第一次访问服务器资源的时候,服务器返回到浏览器后,浏览器进行缓存 # 缓存的大概内容有: # 1.缓存过期的日期和时间 # 2.设置和缓存相关的配置信息 # 3.请求资源最 ...

  6. 兔起鹘落全端涵盖,Go lang1.18入门精炼教程,由白丁入鸿儒,全平台(Sublime 4)Go lang开发环境搭建EP00

    Go lang,为并发而生的静态语言,源于C语言又不拘泥于性能,高效却不流于古板,Python灵活,略输性能,Java严谨,稍逊风骚.君不见各大厂牌均纷纷使用Go lang对自己的高并发业务进行重构, ...

  7. CF242E XOR on Segment

    CF242E XOR on Segment codeforces 洛谷 关于异或,无法运用懒标记实现区间异或: 可以像trie树一样拆位,将每个值拆成二进制数,对此建相应个数的线段树. 0 1与 0异 ...

  8. mybatis 05: mybatis中的动态代理

    mybatis中动态代理存在的意义 图示 图示分析 分层说明:界面层为第一层,业务逻辑层(接口层 + 实现层)为第二层,数据访问层(接口层 + 实现层)为第三层 业务逻辑层和数据访问层:分别分两层来开 ...

  9. jQuery基础入门(二)

    jQuery 效果 显示和隐藏 在 jQuery 中可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素,以及使用 toggle() 方法能够切换 hide() 和 show() ...

  10. 使用Linux、Nginx和Github Actions托管部署ASP.NET Core 6.0应用

    使用Linux.Nginx和Github Actions托管部署ASP.NET Core 6.0应用 前言 本文主要参考微软这篇文档而来 Host ASP.NET Core on Linux with ...