这道题看起来像是线段树和最大子段和的结合,但这里求最大子段和不用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. 基于yum安装CDH集群

    一.环境准备 准备至少3台设备:CentOS7系统: 如果是在实验环境下,给虚拟机的内存至少4G,根建议1T,数据盘1T,由于是虚拟机,所以根分区和数据盘放心大胆的给:如果是在生产环境则多多益善:我这 ...

  2. HTTP协议-工作原理及消息结构

    HTTP协议 HTTP协议是Hyper Test Transfer Protocol(超文本传输协议)的缩写 适用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传输协 ...

  3. 四位一体水溶交融,Docker一拖三Tornado6.2 + Nginx + Supervisord非阻塞负载均衡容器式部署实践

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_203 容器,又见容器.Docker容器的最主要优点就在于它们是可移植的.一套服务,其所有的依赖关系可以捆绑到一个独立于Linux内 ...

  4. 网络编程、OSI七层协议

    目录 软件开发架构 1.什么是软件开发架构 2.软件开发架构 3.架构优劣势 4.架构发展趋势 网络编程简介 1.如何理解网络编程 2.网络编程的目的 3.网络编程的意义 4.网络编程的起源 5.网络 ...

  5. Python 懂车帝口碑分爬虫

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! Python 懂车帝口碑分爬虫 需求 懂 ...

  6. django自带的序列化组件

    1.什么是序列化组件 在django中,自带一个序列化组件,它是用来将数据进行整理.转化成特定的为一个特定的格式(比如json数据格式),然后传输给前端,以便前端对数据进行处理操作. 2.为什么要用序 ...

  7. 基于bert_bilstm_crf的命名实体

    前言 本文将介绍基于pytorch的bert_bilstm_crf进行命名实体识别,涵盖多个数据集.命名实体识别指的是从文本中提取出想要的实体,本文使用的标注方式是BIOES,例如,对于文本虞兔良先生 ...

  8. 理解 Flutter 的基础概念:Widget

    Widget 的本意是组件的意思,熟悉 Web 应用开发的人在后期必定会接触到 Vue.React 等框架,这些框架都有一个核心的概念 -- 组件.组件的目的也很简单,那就是重复率用一段代码,并且能够 ...

  9. K8S中部署apisix(非ingress)

    不使用pvc的方式在K8S中部署apisix-gateway 简介 因为公司项目准备重构,现在做技术储备,之前公司项目使用的ocelot做网关,ocelot是.net平台下的一个网关,也是很不错,但是 ...

  10. 【java】学习路径16-重写Object方法(equals()等)

    在平时开发中,想要比较自定义类对象中的特定成员时,我们需要逐一手动比较,非常不方便. 举个栗子,我们有两个cafe对象,我们想比较两杯咖啡的价格是否一样,一般来说我们使用getter()来比较,但是这 ...