题目链接: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 ;
}

最新文章

  1. js字符串格式化扩展方法
  2. Linux的一些常用快捷键和基本命令
  3. 数据库开发基础-SQl Server 主键、外键、子查询(嵌套查询)
  4. Entity Framework 异常档案
  5. js- 千分位分割
  6. unity3d 游戏对象消失三种方法的区别(enabled/Destroy/active)
  7. 【转】 hive简介,安装 配置常见问题和例子
  8. 理解阻止浏览器默认事件和事件冒泡cancelBubble
  9. 监视/etc/passwd文件是否正常
  10. 简单的猜数字(JAVA版)
  11. POJ1163——The Triangle
  12. 数据库 —— 基于 ORM 模型的 Hibernate 的使用(java)
  13. C语言中结构体定义实际上相当于变量入栈
  14. JAVA 并发(待补全!)
  15. Vue 进阶之路(三)
  16. Linux iptables用法与NAT
  17. 连表查询都用Left Join吧
  18. C++ 文件操作(简易的学籍管理系统)
  19. pc端字体大小自适应几种方法
  20. cent OS 7查询IP

热门文章

  1. @清晰掉 string.h之基础堵漏
  2. 复选框checked 选中后不显示打钩
  3. redis 管理工具
  4. spring boot加载自定义配置
  5. delphi : 窗体的close,free,destroy
  6. Visdom可视化
  7. 【Python】我的第一个豆瓣短评爬虫
  8. selenium:css_selector定位详解(css selector和xpath的比较)
  9. centos 7 中如何提取IP地址
  10. java版微信支付/查询/撤销