题目链接:传送门

描述
输入一个长度为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 \le 300000)$
第二行有 $n$ 个数,要求在 $n$ 个数找到最大子序和

输出格式
一个数,数出他们的最大子序和

样例输入
6 4
1 -3 5 1 -2 3
样例输出
7

题解:

设这 $n$ 个数的前缀和为 $s_1 \sim s_n$。考虑枚举右端点 $i$,当右端点 $i$ 固定时,显然连续子序列的和为 $s_i - s_{j-1}$。

因此相当于我们要寻找一个点 $y$,使其满足 $y \in [i-m, i-1]$ 的前提下 $s_y$ 最小。

显然,当对于满足 $i-m \le x < y < i$ 的两个点 $x,y$,如果 $s_x \ge s_y$,显然 $x$ 点不能成为最优解,因此可以直接舍弃掉 $x$。

因此,用一个双端队列维护 $j$,队列中的 $j$ 满足随着下标的递增,相应的 $s_j$ 也是递增的。

这样一来,每次对于 $i$ 寻找 $j$,只要从头部抛去 $s_$ 点,剩下来的队头就是最优的 $j$。

而当前 $i$ 入队,为了保持队列的递增性,因此要在队尾抛去所有 $s_{back} \ge s_i$ 的点。

时间复杂度:所有点出入队一次,$O(n)$。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=+;
int n,m,ans;
int a[maxn],s[maxn];
deque<int> Q;
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m;
ans=-INF, s[]=;
Q.push_back();
for(int i=;i<=n;i++)
{
cin>>a[i], s[i]=s[i-]+a[i];
while(!Q.empty() && Q.front()<i-m) Q.pop_front();
ans=max(ans,s[i]-s[Q.front()]);
while(!Q.empty() && s[Q.back()]>=s[i]) Q.pop_back();
Q.push_back(i);
}
cout<<ans<<endl;
}

CH 1201 - 最大子序和 - [单调队列]的更多相关文章

  1. CH1201 最大子序和 (单调队列)

    题目链接: AcWing 牛客 题目描述 输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7 当 ...

  2. ContestHunter 1201 最大子序和

    描述 输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大. 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7当m=2或m=3时,S=5+1=6 输入 ...

  3. hdu 6319 逆序建单调队列

    题目传送门//res tp hdu 维护递增单调队列 根据数据范围推测应为O(n)的. 我们需要维护一个区间的信息,区间内信息是"有序"的,同时需要在O(1)的时间进行相邻区间的信 ...

  4. 单调栈&单调队列学习笔记!

    ummm,,,都是单调系列就都一起学了算了思想应该都差不多呢qwq 其实感觉这俩没有什么可说的鸭QAQ就是维护一个单调的东西,区别在于单调栈是一段进一段出然后单调队列是一段进另一段出?没了 好趴辣重点 ...

  5. 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 输 ...

  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 输入 ...

  7. AcWing:135. 最大子序和(前缀和 + 单调队列)

    输入一个长度为n的整数序列,从中找出一段长度不超过m的连续子序列,使得子序列中所有数的和最大. 输入格式 第一行输入两个整数n,m. 第二行输入n个数,代表长度为n的整数序列. 同一行数之间用空格隔开 ...

  8. 【动态规划】【单调队列】tyvj1305 最大子序和

    http://blog.csdn.net/oiljt12138/article/details/51174560 单调队列优化dp #include<cstdio> #include< ...

  9. tyvj1305 最大子序和(单调队列

    题目地址:http://www.joyoi.cn/problem/tyvj-1305 最大子序和 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Loc ...

随机推荐

  1. Nginx配置静态资源

    静态服务器 静态服务器概念非常简单:当用户请求静态资源时,把文件内容回复给用户. 但是,要把静态服务做到极致,需要考虑的方面非常多: 正确书写header:设置content-type.过期时间等 效 ...

  2. 分区工具parted的详解及常用分区使用方法【转】

    来源:http://blog.51cto.com/zhangmingqian/1068779 分区工具parted的详解及常用分区使用方法 一.         parted的用途及说明 概括使用说明 ...

  3. linux达人养成计划学习笔记(七)—— 用户登录查看命令

    一.查看用户登录信息 1.命令格式 w 2.命令结果 第一行信息是:系统当前时间     系统运行总时间     登录用户数量     一分钟/五分钟/十分钟的系统负载(越大越差) 二.who命令 1 ...

  4. Kriging插值法

    克里金法是通过一组具有 z 值的分散点生成估计表面的高级地统计过程.与插值工具集中的其他插值方法不同,选择用于生成输出表面的最佳估算方法之前,有效使用克里金法工具涉及 z 值表示的现象的空间行为的交互 ...

  5. 12C -- ORA-12850: 无法在所有指定实例上分配从属进程: 需要 2, 已分配 1

    使用客户端连接到oracle 12.2.0.1 rac数据库,报以下错误信息: ORA-12850: 无法在所有指定实例上分配从属进程: 需要 2, 已分配 1 因为没有mos账号,只好谷歌一下了.找 ...

  6. [转]Java 反射在实际开发中的应用

    一:Java类加载和初始化 1.1 类加载器(类加载的工具) 1.2 Java使用一个类所需的准备工作 二:Java中RTTI 2.1 :为什么要用到运行时类型信息(就是RTTI) 2.2  :RTT ...

  7. 升级python(linux)

    查看系统当前python版本 2: [root@wangyuelou ~]# python     Python 2.4.3 (#1, May  5 2011, 16:39:10)     [GCC ...

  8. sublime text 3 安装卸载插件和取消启动检查更新

    1.Perferences->Package Contro,输入install 调出 Install Package 选项并回车 2.安装相应的插件 2.点击首选项–设置(用户) 3.卸载插件 ...

  9. html5中的input和label写法与取值

    demo 效果图如上 label是html5特有的,是定义 input 元素的标注.凡是input前面要有个label标识下,label和input真是一对好兄弟啊.<label> 标签的 ...

  10. centos6.5安装mongodb2.6

    下载地址:http://www.mongodb.org/downloads 解压命令:tar zxf mongodb-linux-i686-2.6.0.tgz 存放目录:/usr/local/mong ...