题目链接:https://www.luogu.org/problem/P4513

题目大意:单点修改和求区间最大连续字段和

解题思路:很容易想到是用线段树来做,但是如何进行维护呢?

每个维护区间 [L,R]的节点内我们需要维护以下信息:

sum:[L,R]的区间和

lm:从左端点 L开始的最大子段和(简称左子段和)

rm:从右端点 R 开始的最大子段和(简称右子段和)

ans:[L,R] 内的最大子段和

注意:询问区间跨过mid时要合并一下答案,思路与pushup函数中的差不多

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=+;
int n,m,a[maxn];
struct node{
int lm,rm,sum,ans;
}tree[maxn*];
void pushup(int rt){
tree[rt].lm=max(tree[rt<<].lm,tree[rt<<].sum+tree[rt<<|].lm);
tree[rt].rm=max(tree[rt<<|].rm,tree[rt<<|].sum+tree[rt<<].rm);
tree[rt].sum=tree[rt<<].sum+tree[rt<<|].sum;
tree[rt].ans=max(max(tree[rt<<].ans,tree[rt<<|].ans),tree[rt<<].rm+tree[rt<<|].lm);
}
void build(int l,int r,int rt){
if(l==r){
tree[rt].lm=tree[rt].rm=tree[rt].sum=tree[rt].ans=a[l];
return;
}
int mid=(l+r)>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
pushup(rt);
}
void update(int pos,int val,int l,int r,int rt){
if(l==r){
tree[rt].lm=tree[rt].rm=tree[rt].sum=tree[rt].ans=val;
return;
}
int mid=(l+r)>>;
if(pos<=mid) update(pos,val,l,mid,rt<<);
else update(pos,val,mid+,r,rt<<|);
pushup(rt);
}
node query(int L,int R,int l,int r,int rt){
if(L<=l&&R>=r) return tree[rt]; //区间完全覆盖,直接返回该节点
int mid=(l+r)>>;
if(R<=mid) return query(L,R,l,mid,rt<<); //只在左区间,直接查询左区间
else if(L>mid) return query(L,R,mid+,r,rt<<|); //只在右区间,直接查询右区间
else{ //左右区间都有,考虑如何合并
//res1记录左覆盖区间,res2记录右覆盖区间
node res,res1=query(L,mid,l,mid,rt<<),res2=query(mid+,R,mid+,r,rt<<|);
res.lm=max(res1.lm,res1.sum+res2.lm);
res.rm=max(res2.rm,res2.sum+res1.rm);
res.ans=max(max(res1.ans,res2.ans),res1.rm+res2.lm);
return res;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
build(,n,);
while(m--){
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op==){
if(x>y) swap(x,y);
printf("%d\n",query(x,y,,n,).ans);
}else update(x,y,,n,);
}
return ;
}

P4513 最大连续字段和 (线段树+区间合并)的更多相关文章

  1. 【bzoj3638】Cf172 k-Maximum Subsequence Sum 模拟费用流+线段树区间合并

    题目描述 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交的不超过k个子段,最大的和是多少. 输入 The first line contains inte ...

  2. POJ 3667 Hotel(线段树 区间合并)

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

  3. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  4. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  5. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

  6. 线段树(区间合并) POJ 3667 Hotel

    题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...

  7. SPOJ GSS1_Can you answer these queries I(线段树区间合并)

    SPOJ GSS1_Can you answer these queries I(线段树区间合并) 标签(空格分隔): 线段树区间合并 题目链接 GSS1 - Can you answer these ...

  8. hdu 3911 Black And White (线段树 区间合并)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3911 题意: 给你一段01序列,有两个操作: 1.区间异或,2.询问区间最长的连续的1得长度 思路: ...

  9. hdu-3308 LCIS (线段树区间合并)

    LCIS Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  10. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

随机推荐

  1. 第四周总结 & 实验报告(二)

    第四周课程总结 一.String类 1.实例化 (1)直接赋值 public class Xxxx{ public static void main(String args[]){ String a ...

  2. leetcode-mid-sorting and searching - 56 Merge Intervals

    mycode 出现的问题:比如最后一个元素是[1,10],1小于前面所有元素的最小值,10大于前面所有元素的最大值,而我最开始的思路只考虑了相邻 参考: 思路:如果我只考虑相邻,必须先将list排序, ...

  3. ES6中let和var的区别

    通过var定义的变量,作用域是整个封闭函数,是全域的 .通过let定义的变量,作用域是在块级或是子块中. 变量提升现象:浏览器在运行代码之前会进行预解析 -不论var声明的变量处于当前作用域的第几行, ...

  4. rename()函数(包含更改索引列列名的方法)

    1 rename()可以更换列名和行名,必须写上columns或index,否则无效 import pandas as pd df = pd.DataFrame({'a':[1,2], 'b':[3, ...

  5. django项目部署过程

    django项目部署过程 1.上传代码 用git或者其他工具,如scp 代码上传后保证每个应用下的migrations文件夹里只有一个__init__.py文件,自己的迁移文件不要上传上来,具体的gi ...

  6. Python中的Django框架中prefetch_related()函数对数据库查询的优化

    实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  7. 设置了responseType:Blob之后,如果返回json错误信息,如果获取?

    最近做了一个文件下载功能,于是设置了responseType: Blob的方式, 什么是Blob呢,MDN官方解释:Blob 对象表示一个不可变.原始数据的类文件对象.Blob 表示的不一定是Java ...

  8. Debian系列Linux的隐藏WiFi

    Debian系列Linux共用相同的deb安装包,拥有大量的各种软件,是Linux里面最主要的生态系.包括Ubuntu及其衍生版本如Lubuntu/Mate/Kubuntu等,在ARM上也有很好的支持 ...

  9. 本机添加DNS映射

    开发项目时本地进行代码编写测试,需要与服务器主机进行DNS映射. 本地主机添加DNS映射步骤 一:复制备份hosts文件 找到C:\Windows\System32\drivers\etc下的host ...

  10. cocos2dx基础篇(13) 编辑框之二CCEditBox

    [3.x] (1)去掉"CC" (2)设置虚拟键盘的编辑类型 > EditBoxInputMode 变为强枚举 EditBox::EditBoxInputMode // SI ...