https://www.luogu.org/problemnew/show/P4513

题意是给你一个序列,计算一个区间内的最大字段和,支持单点修改

线段树维护左起最大字段和,右起最大字段和,区间和和最大字段和,查询时合并区间即可

#include <bits/stdc++.h>
#define CIOS ios::sync_with_stdio(false);
#define For(i, a, b) for(register int i = a; i <= b; i++)
#define Forr(i, a, b) for(register int i = a; i >= b; i--)
using namespace std; typedef unsigned long long ull;
typedef long long ll; template <typename _T>
inline void read(_T &f) {
f = 0; _T fu = 1; char c = getchar();
while(c < '0' || c > '9') { if(c == '-') fu = -1; c = getchar(); }
while(c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
f *= fu;
} template <typename T>
void print(T x) {
if(x < 0) putchar('-'), x = -x;
if(x < 10) putchar(x + 48);
else print(x / 10), putchar(x % 10 + 48);
} template <typename T>
void print(T x, char t) {
print(x); putchar(t);
} const int N = 5e5 + 5; struct ele { ele () {} int lmax, rmax, maxn, sum; };
struct Node { Node () {} int l, r; ele val; } p[N << 2]; int a[N], n, m; ele Merge(ele a, ele b) {
ele ans; ans.sum = a.sum + b.sum;
ans.lmax = max(a.lmax, a.sum + max(0, b.lmax));
ans.rmax = max(b.rmax, b.sum + max(0, a.rmax));
ans.maxn = max(max(a.maxn, b.maxn), max(a.rmax + max(0, b.lmax), max(0, a.rmax) + b.lmax));
return ans;
} void build(int u, int l, int r) {
p[u].l = l, p[u].r = r;
if(l == r) {
p[u].val.lmax = p[u].val.rmax = p[u].val.maxn = p[u].val.sum = a[l];
return;
}
int mid = (l + r) >> 1;
build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r);
p[u].val = Merge(p[u << 1].val, p[u << 1 | 1].val);
} void change(int u, int x, int y) {
if(p[u].l == p[u].r) {
p[u].val.lmax = p[u].val.rmax = p[u].val.maxn = p[u].val.sum = y;
return;
}
int mid = (p[u].l + p[u].r) >> 1;
if(mid >= x) change(u << 1, x, y); else change(u << 1 | 1, x, y);
p[u].val = Merge(p[u << 1].val, p[u << 1 | 1].val);
} ele query(int u, int l, int r) {
if(p[u].l >= l && p[u].r <= r) return p[u].val;
int mid = (p[u].l + p[u].r) >> 1;
if(mid >= l && mid + 1 <= r) return Merge(query(u << 1, l, r), query(u << 1 | 1, l, r));
else if(mid >= l) return query(u << 1, l, r); else return query(u << 1 | 1, l, r);
} int main() {
read(n); read(m);
for(register int i = 1; i <= n; i++) read(a[i]);
build(1, 1, n);
while(m--) {
int opt, x, y;
read(opt); read(x); read(y);
if(opt == 1) {
if(x > y) swap(x, y);
print(query(1, x, y).maxn, '\n');
} else change(1, x, y);
}
return 0;
}

最新文章

  1. 安装了ubuntu14.04+windows7双系统的笔记本启动后出现grub rescue&gt;提示符
  2. 在Ecshop后台打印订单页面将商品按货号排序
  3. android:launchMode概述
  4. POJ 3233 矩阵乘法
  5. Unity扩展编辑器--类型1:Editor Windows
  6. eval 捕获dbi错误
  7. 当用反射获取一个model,这个model里面字段有nullable的时候,获取字段真实类型
  8. 会话技术cookie和session详解
  9. Q:java中serialVersionUID的作用
  10. 用CSS画出好玩的图形
  11. Java语言基础组成
  12. GZip 压缩及解压缩
  13. [Reversing.kr] Easy Crack Writeup
  14. 给Integer对象加锁的错误方式
  15. Confluence 6 home 目录
  16. c#获取汉字首字母拼音
  17. Java基础 - 线程(一)
  18. go服务运行框架go-svc
  19. [UE4]Overlay容器:图片随着其他容器(比如Vertical Box)大小而同步改变
  20. In House打包流程

热门文章

  1. Linux实战教学笔记29:MySQL数据库企业级应用实践
  2. python 文件的读取&amp;更新
  3. Unity几个有用的游戏运动特效
  4. windows版本免安装redis, nginx, zookeeper
  5. Java-精确计算工具类
  6. 10-最小生成树-Prim算法
  7. cacti监控mssql 2005运行资源情况
  8. vs2017编译并配置libcurl入门教程
  9. ECS 游戏架构 应用
  10. mysql 添加字段,修改字段的用法