SPOJ GSS3 (动态dp)
题意
Sol
这题可以动态dp做。
设\(f[i]\)表示以\(i\)为结尾的最大子段和,\(g[i]\)表示\(1-i\)的最大子段和
那么
\(f[i] = max(f[i - 1] + a[i], a[i])\)
\(g[i] = max(g[i - 1], f[i])\)
发现只跟前一项有关,而且\(g[i]从\)f[i]$转移过来的那一项可以直接拆开
那么构造矩阵
a_{i} & -\infty & \dots a_{i} \\
a_{i}, & 0 & a_{i}\\
-\infty, & -\infty & 0 \\
\end{bmatrix}
\]
直接转移就行了
复杂度\(O(nlogn * 27)\)
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10, INF = 1e9;
template<typename A, typename B> inline bool chmax(A &x, B y) {return x < y ? x = y, 1 : 0;}
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
struct Ma {
int m[4][4];
Ma() {
memset(m, -0x3f, sizeof(m));
}
Ma operator * (const Ma &rhs) const {
Ma ans;
for(int i = 1; i <= 3; i++)
for(int j = 1; j <= 3; j++)
for(int k = 1; k <= 3; k++)
chmax(ans.m[i][j], m[i][k] + rhs.m[k][j]);
return ans;
}
void init(int v) {
m[1][1] = v; m[1][2] = -INF; m[1][3] = v;
m[2][1] = v; m[2][2] = 0; m[2][3] = v;
m[3][1] = -INF; m[3][2] = -INF; m[3][3] = 0;
}
}m[MAXN];
int N, M, a[MAXN];
#define ls k << 1
#define rs k << 1 | 1
void update(int k) {
m[k] = m[ls] * m[rs];
}
void Build(int k, int l, int r) {
if(l == r) {m[k].init(a[l]); return ;}
int mid = l + r >> 1;
Build(ls, l, mid); Build(rs, mid + 1, r);
update(k);
}
void Modify(int k, int l, int r, int p, int v) {
if(l == r) {m[k].init(v); return ;}
int mid = l + r >> 1;
if(p <= mid) Modify(ls, l, mid, p, v);
else Modify(rs, mid + 1, r, p, v);
update(k);
}
Ma Query(int k, int l, int r, int ql, int qr) {
if(ql <= l && r <= qr)
return m[k];
int mid = l + r >> 1;
if(ql > mid) return Query(rs, mid + 1, r, ql, qr);
else if(qr <= mid) return Query(ls, l, mid, ql, qr);
else return (Query(ls, l, mid, ql, qr) * Query(rs, mid + 1, r, ql, qr));
}
int main() {
N = read();
for(int i = 1; i <= N; i++) a[i] = read();
Build(1, 1, N);
M = read();
while(M--) {
int opt = read(), x = read(), y = read();
if(opt == 0) Modify(1, 1, N, x, y);
else {
Ma ans = Query(1, 1, N, x, y);
printf("%d\n", max(ans.m[2][1], ans.m[2][3]));
}
}
return 0;
}
/*
4
-1 -2 -3 -4
2
1 1 4
1 1 2
*/
SPOJ GSS3 (动态dp)的更多相关文章
- 【学习笔记】动态 dp 入门简易教程
序列 dp 引入:最大子段和 给定一个数列 \(a_1, a_2, \cdots, a_n\)(可能为负),求 \(\max\limits_{1\le l\le r\le n}\left\{\sum_ ...
- 动态dp初探
动态dp初探 动态区间最大子段和问题 给出长度为\(n\)的序列和\(m\)次操作,每次修改一个元素的值或查询区间的最大字段和(SP1714 GSS3). 设\(f[i]\)为以下标\(i\)结尾的最 ...
- 动态DP教程
目录 前言 开始 更进一步 前言 最后一届NOIPTG的day2T3对于动态DP的普及起到了巨大的作用.然而我到现在还不会 开始 SP1716 GSS3 - Can you answer these ...
- SPOJ GSS3 Can you answer these queries III[线段树]
SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...
- 动态DP之全局平衡二叉树
目录 前置知识 全局平衡二叉树 大致介绍 建图过程 修改过程 询问过程 时间复杂度的证明 板题 前置知识 在学习如何使用全局平衡二叉树之前,你首先要知道如何使用树链剖分解决动态DP问题.这里仅做一个简 ...
- Luogu P4643 【模板】动态dp
题目链接 Luogu P4643 题解 猫锟在WC2018讲的黑科技--动态DP,就是一个画风正常的DP问题再加上一个动态修改操作,就像这道题一样.(这道题也是PPT中的例题) 动态DP的一个套路是把 ...
- 动态dp学习笔记
我们经常会遇到一些问题,是一些dp的模型,但是加上了什么待修改强制在线之类的,十分毒瘤,如果能有一个模式化的东西解决这类问题就会非常好. 给定一棵n个点的树,点带点权. 有m次操作,每次操作给定x,y ...
- 洛谷P4719 动态dp
动态DP其实挺简单一个东西. 把DP值的定义改成去掉重儿子之后的DP值. 重链上的答案就用线段树/lct维护,维护子段/矩阵都可以.其实本质上差不多... 修改的时候在log个线段树上修改.轻儿子所在 ...
- 动态 DP 学习笔记
不得不承认,去年提高组 D2T3 对动态 DP 起到了良好的普及效果. 动态 DP 主要用于解决一类问题.这类问题一般原本都是较为简单的树上 DP 问题,但是被套上了丧心病狂的修改点权的操作.举个例子 ...
随机推荐
- php安装扩展的几种方法
转自:http://doc3.workerman.net/appendices/install-extension.html 安装扩展 注意 与Apache+PHP或者Nginx+PHP的运行模式不同 ...
- Android开发工程师文集-Android知识点讲解
前言 大家好,给大家带来Android开发工程师文集-Android知识点讲解的概述,希望你们喜欢 WebView讲解 一般通过Intent调用系统的浏览器: Uri uri = Uri.parse( ...
- web API简介(二):客户端储存之document.cookie API
概述 前篇:web API简介(一):API,Ajax和Fetch 客户端储存从某一方面来说和动态网站差不多.动态网站是用服务端来储存数据,而客户端储存是用客户端来储存数据.document.cook ...
- EXCEL在改动某几个单元格时隐藏空列
概述 今天我哥来找我帮他搞下excel表格,本着程序猿对程序无所不能的精神,我爽快的答应了.结果查了半天才搞定.现在记录在此,供自己以后参考,相信对其他人也有用. PS:这几天正在弄博客,马上就要弄完 ...
- LeetCode:145_Binary Tree Postorder Traversal | 二叉树后序遍历 | Hard
题目:Binary Tree Postorder Traversal 二叉树的后序遍历,题目要求是采用非递归的方式,这个在上数据结构的课时已经很清楚了,二叉树的非递归遍历不管采用何种方式,都需要用到栈 ...
- Spring Boot自动配置原理、实战
Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...
- Python基础教程(第3版) 笔记(二)
1.8模块Python提供了完成(某人的年 龄为32.9,并想将这个值向下圆整为32,因为他还没有满33岁)这种任务的函 数floor.导入模块,可以使用特殊命令import.函数floor包含在模块 ...
- [EXP]McAfee ePO 5.9.1 - Registered Executable Local Access Bypass
# Exploit Title: McAfee ePO 5.9.1 Registered Executable Local Access Bypass # Date: 2019-03-07 # Exp ...
- 关于git的常用命令
1.git add <name> 将工作区的内容添加到暂存区 2.git commit -m <备注> 将内容提交到暂存区 3.git status 查看状态 4. git ...
- jquery 回车键实现表单提交
JQery http://jquery.cuishifeng.cn/keydown.html 键盘事件参考:1.keydown()keydown事件会在键盘按下时触发.2.keyup()keyup事件 ...