题目链接: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. 错误1919,配置ODBC数据源MS Access Database时发生错误ODEC错误

    WIN7 64位旗舰版安装OFFICE2003 提示:“错误1919,配置ODBC数据源MS Access Database时发生错误ODEC错误” 在64位系统上,32位软件的注册表的信息不是直接在 ...

  2. tp 下载

    public function download() { //文件名 $filename=input('filename'); // $file_dir = $_SERVER["DOCUME ...

  3. Python深度学习读书笔记-3.神经网络的数据表示

    标量(0D 张量) 仅包含一个数字的张量叫作标量(scalar,也叫标量张量.零维张量.0D 张量).在Numpy 中,一个float32 或float64 的数字就是一个标量张量(或标量数组).你可 ...

  4. 【洛谷T89359 扫雷】

    题目链接 这个题有一个十分简单的做法 我们可以考虑位运算 按位异或(^) 异或,英文为exclusive OR,缩写成xor 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”, ...

  5. VS2010护眼界面(护眼绿)

    工具-->选项 RGB(204.232.207) “选择菜单[工具][导入和导出设置], 在弹出的“导入和导出设置向导”对话框中选择“导入选定的环境设置”, 然后根据自己的实际情况选择“是,保存 ...

  6. web可拖动控件js

    先下载:http://code.jquery.com/ui/1.10.3/jquery-ui.js $('.i-i-yuan').draggable({ containment: '#app'//可通 ...

  7. Python学习之==>URL编码解码&if __name__ == '__main__'

    一.URL编码解码 url的编码解码需要用到标准模块urllib中的parse方法 from urllib import parse url = 'http://www.baidu.com?query ...

  8. Python学习之==>操作Redis

    一.redis简介 1.非关系型数据库 2.数据全部是存在内存里面 3.性能非常好,每秒支持30w次读写 4.可以通过备份数据库,把数据存到磁盘上来实现数据的持久化 二.操作redis 1.strin ...

  9. Win8.1+VS2013+WDK8.1+VirtualBox or VMware 驱动开发环境配置

    https://blog.csdn.net/charlessimonyi/article/details/50904956 Win8.1+VS2013+WDK8.1+VirtualBox or VMw ...

  10. excel 导入导出测试点

    目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel ...