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 问题,但是被套上了丧心病狂的修改点权的操作.举个例子 ...
随机推荐
- Java SE核心之一:常用类,包装类,其他基本数据类型包装类。
在Java继承体系中,java.lang.Object类位于顶端(是所有对象的直接或间接父类).如果一个类没有写extends关键字声明其父类,则该类默认继承java.lang.Object类.Obj ...
- WannaCry勒索病毒全解读,权威修复指南大集合
多地的出入境.派出所等公安网络疑似遭遇了勒索蠕虫病毒袭击,已暂时停办出入境业务:加油站突然断网,不能支持支付宝.微信.银联卡等联网支付:大批高校师生电脑中的文件被蠕虫病毒加密,需要支付相应的赎金方可解 ...
- 一致性hash理解、拜占庭将军问题解读和CAP理论总结
一致性hash理解 白话概述: 比如说存储图片,有10台服务器用来存储,对图片名进行hash(pic_name)%10得到的值就是图片存放的服务器序号.这是正常的hash算法分散图片存储.但是有一天, ...
- 理解Docker
Docker Image OS分为 内核(kernel) 和 用户 空间,kernel 启动后,会挂载root文件系统提供用户空间. Docker Image 就相当于一个 root文件系统.是一个特 ...
- 干货—MySQL常见的面试题+索引原理分析!
目录 MySQL索引的本质 MySQL索引的底层原理 MySQL索引的实战经验 面试 问:数据库中最常见的慢查询优化方式是什么? 同学A:加索引. 问:为什么加索引能优化慢查询? 同学A:...不知道 ...
- 用vue-cli脚手架搭建一个仿网易云音乐的全家桶vue项目
一,vue-cli环境搭建 1,全局安装webpack npm install webpack -g 2,安装vue脚手架 npm install vue-cli -g 3,新建一个新的project ...
- linux下应用程序性能剖分神器gprofiler-tools-安装和使用
最近在摆弄算法的的优化,需要剖分一下算法的瓶颈,就找了一些代码剖分工具,其中 gprofileer-tools是很不错的工具,gperftools时google开源的一款C++性能分析分析工具,git ...
- Testing - 软件测试知识汇总
软件测试知识梳理 基础概念 : http://www.cnblogs.com/anliven/p/6070000.html 测试分类 : http://www.cnblogs.com/anliven/ ...
- 微软2014校招笔试题-String reorder
Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB Description For this question, your pro ...
- web自动化测试---概述
最早的时候是做功能测试,web都是自己手工点击看看有没问题,没有系统的进行测试,更别说自动化测试了,那是一段不堪回首的往事,就是因为这,很多问题都流出去了,这是作为测试人员的一大失职,痛定思痛,开始学 ...