题目链接:传送门

描述
输入一个长度为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. APP安全测评checklist---Android

    首先,你的app得先混淆:AndroidStudio 混淆打包 先来个checklist: 编号 检查项目 测评结果 1 明文传输用户名.密码和验证码等敏感信息. 2 不安全的本地存储. 3 泄漏后台 ...

  2. Photodesk for Mac(Instagram 桌面客户端)破解版安装

    1.软件简介    PhotoDesk - for Instagram 是 macOS 系统上一款 Instagram 客户端,可以让大家在 Mac 上观看朋友的新照片.或是最近热门的作品,也可以 f ...

  3. 在 OC 中调用 Swift 代码

    1.在 Objective-C 项目中使用 Swift 代码 1)在 OC 项目中创建 .Swift 文件,文件中的格式为其本有的格式. 2)Xcode 提示是否创建 Objective-C brid ...

  4. mysql 编译安装 window篇

    传送门 # mysql下载地址 https://www.mysql.com/downloads/ # 找到MySQL Community Edition (GPL) https://dev.mysql ...

  5. 关于Installation error: INSTALL_FAILED_NO_MATCHING_ABIS的解决方法

    遇到过好几次这种错误提示,工程代码没有任何错误,但是连安装都安装不上模拟器,console控制台就报出上面的错误: [2015-11-25 15:15:37 - Em4.x] Installation ...

  6. JPA+Hibernate 3.3 ——增删改查

    1.     查找对象   1)  用find()方法查找对象 public void getPerson(){ EntityManagerFactory factory = Persistence. ...

  7. Android Gallery实现3D相册(附效果图+Demo源码)

    今天因为要做一个设置开机画面的功能,主要是让用户可以设置自己的开机画面,应用层需要做让用户选择开机画面图片的功能.所以需要做一个简单的图片浏览选择程序.最后选用Gallery作为基本控件.加入了一些炫 ...

  8. 能ping通外网的域名,浏览器不能上网的解决办法

    1,依次尝试了关闭防火墙,关闭杀毒软件,手动设置DNS都没有用. 2,最后通过这个cmd命令搞定,特此记录一下,重置初始化网络环境. netsh winsock reset 补充,上面的命令,重启电脑 ...

  9. 练手之RimLight

    简单写写,练下手~ Shader "James/VP Shader/RimLight" { Properties { _MainTex("MainTex", 2 ...

  10. JavaScript Scroll家族以及封装

    JavaScript Scroll家族以及封装 scrollTop & scrollLeft 别卷去的值,就是当滑动滚轮浏览网页的时候,网页隐藏在屏幕上方或左侧的距离 获得scrollTop ...