SPOJ GSS3 Can you answer these queries III (线段树)
时间:2019-08-07
本文章向大家介绍SPOJ GSS3 Can you answer these queries III (线段树),主要包括SPOJ GSS3 Can you answer these queries III (线段树)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意:带修 求区间最大连续子段和
题解:我们需要维护的信息有 区间和 区间最大子段和 区间左连续最大子段和 区间右连续最大子段和
然后模拟即可
#include <bits/stdc++.h> 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; }
原文地址:https://www.cnblogs.com/lwqq3/p/11318255.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python手写了 35 种可解释的特征工程方法
- Geant4--G4ParticleGun定义射线源的发射能谱
- Sony-PMCA-RE, 反向工程索尼PlayMemories相机应用
- 中标麒麟系统Your trial is EXPIRED and no VALID licens
- R初探
- 独家 | 在Python编程面试前需要学会的10个算法(附代码)
- 为什么一个还没毕业的大学生能够把 IO 讲的这么好?
- 如何将单 master 升级为多 master 集群
- 为 Kubernetes 节点发布扩展资源
- Kubernetes 资源预留配置
- PHP一些常见的漏洞梳理
- File的基本操作
- 一文教你在Colab上使用TPU训练模型
- 如何在Docker容器中运行Docker [3种方法]
- [漏洞复现] 三.CVE-2020-0601微软证书漏洞及Windows验证机制欺骗复现