博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPOJ GSS3 Can you answer these queries III (线段树)
阅读量:5025 次
发布时间:2019-06-12

本文共 1995 字,大约阅读时间需要 6 分钟。

题意:带修 求区间最大连续子段和

题解:我们需要维护的信息有 区间和 区间最大子段和 区间左连续最大子段和 区间右连续最大子段和

   然后模拟即可

 

#include 
using namespace std;const int MAXN = 5e4 + 5;int n, m;int a[MAXN];struct node { int sum, ssum, ls, rs;}E[MAXN << 2];void pushup(int rt) { int lr = rt << 1; int rr = rt << 1 | 1; E[rt].ssum = E[lr].ssum + E[rr].ssum; E[rt].sum = max(E[lr].sum, E[rr].sum); E[rt].sum = max(E[rt].sum, E[lr].rs + E[rr].ls); E[rt].ls = max(E[lr].ls, E[lr].ssum + E[rr].ls); E[rt].rs = max(E[rr].rs, E[rr].ssum + E[lr].rs);}void build(int l, int r, int rt) { if(l == r) { E[rt].sum = a[l]; E[rt].ls = E[rt].rs = E[rt].ssum = a[l]; return; } int mid = l + r >> 1; build(l, mid, rt << 1); build(mid + 1, r, rt << 1 | 1); pushup(rt);}void update(int k, int v, int l, int r, int rt) { if(l == r) { E[rt].ssum = E[rt].sum = E[rt].ls = E[rt].rs = v; return; } int mid = l + r >> 1; if(k <= mid) update(k, v, l, mid, rt << 1); else update(k, v, mid + 1, r, rt << 1 | 1); pushup(rt);}node query(int ql, int qr, int l, int r, int rt) { if(ql <= l && qr >= r) return E[rt]; int mid = l + r >> 1; if(qr <= mid) return query(ql, qr, l, mid, rt << 1); if(ql > mid) return query(ql, qr, mid + 1, r, rt << 1 | 1); node ll = query(ql, qr, l, mid, rt << 1); node rr = query(ql, qr, mid + 1, r, rt << 1 | 1); node res; res.ssum = ll.ssum + rr.ssum; res.sum = max(ll.sum, rr.sum); res.sum = max(res.sum, ll.rs + rr.ls); res.ls = max(ll.ls, ll.ssum + rr.ls); res.rs = max(rr.rs, rr.ssum + ll.rs); return res;}int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); build(1, n, 1); scanf("%d", &m); for(int i = 1; i <= m; i++) { int opt, x, y; scanf("%d%d%d", &opt, &x, &y); if(opt == 1) printf("%d\n", query(x, y, 1, n, 1).sum); else update(x, y, 1, n, 1); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/lwqq3/p/11318255.html

你可能感兴趣的文章
样式、格式布局
查看>>
ubuntu设计文件权限
查看>>
Vue双向绑定原理详解
查看>>
Android基础总结(5)——数据存储,持久化技术
查看>>
关于DataSet事务处理以及SqlDataAdapter四种用法
查看>>
bootstrap
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
工程经验总结之吹水"管理大境界"
查看>>
为什么JS动态生成的input标签在后台有时候没法获取到
查看>>
20189210 移动开发平台第六周作业
查看>>
java之hibernate之基于外键的双向一对一关联映射
查看>>
rxjs一句话描述一个操作符(1)
查看>>
第一次独立上手多线程高并发的项目的心路历程
查看>>
ServiceStack 介绍
查看>>
Centos7下载和安装教程
查看>>
无谓的通宵加班之后的思索
查看>>
S1的小成果:MyKTV系统
查看>>
从setting文件导包
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
union和union all
查看>>