CH1201 最大子序和 (单调队列)
题目链接:
题目描述
输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。
例如 1,-3,5,1,-2,3
当m=4时,S=5+1-2+3=7
当m=2或m=3时,S=5+1=6
输入描述:
第一行两个数n,m(\(n,m \leq 300000\))
第二行有n个数,要求在n个数找到最大子序和
输出描述:
一个数,数出他们的最大子序和
示例1
输入
6 4
1 -3 5 1 -2 3
输出
7
思路
单调队列
单调队列模板题
首先这是区间和的问题,先求前缀和 \(sum\)。题目转化为求最大的 \(sum[r] - sum[l]\) 且 \(r - l <= m\)。
枚举右端点 \(r\),维护左端点 \(l \in [r - m, r - 1]\),保持 \(sum[l]\) 最小。
如果某个位置 \(k < l\),且 \(sum[k] \ge sum[l]\),那么直接舍弃 \(k\)。因为 \(l\) 更靠近 \(r\) 且 \(sum[l] <= sum[k]\),这意味着 \(l\) 的生存能力更强。
因此维护一个前缀和递增的单调队列,保持队尾的元素的下标与队首的元素的下标之差不超过 \(m\)。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 10;
int n, m;
ll sum[maxn];
int q[maxn];
void solve() {
ll ans = 0;
int l = 1, r = 1;
q[l] = 0;
for(int i = 1; i <= n; ++i) {
while(l <= r && i - q[l] > m) ++l;
ans = max(ans, sum[i] - sum[q[l]]);
while(l <= r && sum[i] <= sum[q[r]]) --r;
q[++r] = i;
}
cout << ans << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; ++i) {
ll x;
cin >> x;
sum[i] = sum[i - 1] + x;
}
solve();
return 0;
}
deque 版本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 10;
int n, m;
struct Node {
int id; ll val;
} node[maxn];
void solve() {
ll ans = 0;
deque<Node> q;
for(int i = 1; i <= n; ++i) {
while(!q.empty() && i - q.front().id > m) q.pop_front();
ans = max(ans, node[i].val - q.front().val);
while(!q.empty() && node[i].val <= q.back().val) q.pop_back();
q.push_back(node[i]);
}
cout << ans << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; ++i) {
ll x;
cin >> x;
node[i].val = node[i - 1].val + x;
node[i].id = i;
}
solve();
return 0;
}
参考
《算法竞赛进阶指南》 李煜东 著
CH1201 最大子序和 (单调队列)的更多相关文章
- CH 1201 - 最大子序和 - [单调队列]
题目链接:传送门 描述输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大. 例如 $1,-3,5,1,-2,3$. 当 $m=4$ 时,$S=5+1-2+3=7$:当 ...
- CH1201 最大子序和
http://contest-hunter.org:83/contest/0x10%E3%80%8C%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9 ...
- hdu 6319 逆序建单调队列
题目传送门//res tp hdu 维护递增单调队列 根据数据范围推测应为O(n)的. 我们需要维护一个区间的信息,区间内信息是"有序"的,同时需要在O(1)的时间进行相邻区间的信 ...
- 单调栈&单调队列学习笔记!
ummm,,,都是单调系列就都一起学了算了思想应该都差不多呢qwq 其实感觉这俩没有什么可说的鸭QAQ就是维护一个单调的东西,区别在于单调栈是一段进一段出然后单调队列是一段进另一段出?没了 好趴辣重点 ...
- tyvj1305 最大子序和 【单调队列优化dp】
描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7 当m=2或m=3时,S=5+1=6 输 ...
- Tyvj1305最大子序和(单调队列优化dp)
描述 输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7当m=2或m=3时,S=5+1=6 输入 ...
- AcWing:135. 最大子序和(前缀和 + 单调队列)
输入一个长度为n的整数序列,从中找出一段长度不超过m的连续子序列,使得子序列中所有数的和最大. 输入格式 第一行输入两个整数n,m. 第二行输入n个数,代表长度为n的整数序列. 同一行数之间用空格隔开 ...
- 【动态规划】【单调队列】tyvj1305 最大子序和
http://blog.csdn.net/oiljt12138/article/details/51174560 单调队列优化dp #include<cstdio> #include< ...
- tyvj1305 最大子序和(单调队列
题目地址:http://www.joyoi.cn/problem/tyvj-1305 最大子序和 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Loc ...
随机推荐
- c/c++ int 范围的原因
在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来也很简单容易, 以至于不用 ...
- c++简单String类实现
#include <iostream> #include <string> using namespace std; class String { public: String ...
- mysql添加制定ip访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'120.244.114.45' IDENTIFIED BY 'Zhh722@7758521' WITH GRANT OPT ...
- activiti7配置文件activiti.cfg.xml,日志文件log4j.properties及pom文件
activiti.cfg.xml:<?xml version="1.0" encoding="UTF-8"?><beans xmlns=&qu ...
- Oracle查看有锁进程,删除锁
查看锁表进程SQL语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao ...
- 移动端mintUI mt-datetime-picker 组件使用详解
<mt-datetime-picker v-model="pickerVisible" //绑定的数据值 ref="pickerData" // 点击触发 ...
- python之使用多个界定符分割字符串
主要是正则的编写 mport re line = 'asdf fjdk; afed, fjek,asdf, foo' # \s 匹配任意空白符,正则意思:分隔符可以是逗号,分号或者是空格,并且后面紧跟 ...
- Kali Linux 开启SSH
Kali Linux安装好默认是不开启ssh的,需要手工开启 1.修改/etc/ssh/sshd_config 配置文件: root@mykali:~# vi /etc/ssh/sshd_confi ...
- xargs使用之空格处理
xargs指定分隔符为'\n' (默认用空格分隔) locate xxx | xargs -d '\n' ls -l xargs使用 -0 参数会以字符串的'\0'结尾为分隔符,可以在文本传给xarg ...
- xshell安装错解决方案
之前安装过XShell后来因为各种原因不能使用了,卸载和再次安装的时候安装一直失败.研究了好久终于找到解决方案. 只需要删除在C:\Program Files (x86)\InstallShield ...