SSL 2521 数数
2016-12-09 21:14
239 查看
Description
给出一个长度为N的整数序列,选择长度不超过K的段,使总和最大
Simple Input
3 2 1 2 3
Simple Output
5
Hint
1<=K<=N<=10^5abs(a[i])<=10^9
解题思路
因为K,N较大,暴力枚举会超时,于是预处理sum[i]前缀和,枚举右端点r,问题就转换成了在sum[r-k..r-1]中找一个最小值。那么我们维护一个元素单调递增的队列,每次处理完一个r后把队尾所有不小于s[r]的元素删掉后把s[r]放进队尾。那么每次只用把队头中元素在原数组中的下标<r-k的元素删掉,然后选取队头即可得到以r为右端点的最大总和。
Source Code
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; const int MAXN=100100; int a[MAXN],q[MAXN]; long long sum[MAXN],s[MAXN]; int main() { int n,m; memset(sum,0,sizeof(sum)); scanf("%d%d",&n,&m); int i; for (i=1;i<=n;i++) { scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } int head=1,tail=1; long long ans=a[1]; q[1]=0; for (i=1;i<=n;i++) { while (q[head]<=i-m-1) head++; s[i]=sum[i]-sum[q[head]]; tail++; while ((sum[q[tail-1]]>=sum[i])&&(tail>head)) tail--; q[tail]=i; if (s[i]>ans) ans=s[i]; } printf("%lld",ans); }
相关文章推荐
- 该学习了
- LeetCode 189. Rotate Array
- 第十五周项目2-用哈希法组织关键字
- 如何实现UDP的可靠传输
- Leetcode | Binary Tree Inorder Traversal
- Error:Execution failed for task ':XXXX:processDebugManifest'. > Manifest merger failed with multiple
- 【11月】Hey!English
- MySQL远程访问
- TCP的三次握手四次挥手
- 山东理工大学,C++
- JavaScript中的正则表达式对象1--创建
- winform刷新UI界面
- QTreeWidget
- bzoj 3518 Dirichlet卷积
- java实现的类和表持久化
- 学券制(教育券、school voucher)
- VR系列——Oculus Audio sdk文档:六、FMOD Oculus Spatializer集成指南(1)——概述
- 【Spring】Spring高级话题-@Enable***注解的工作原理
- A. Broken Clock
- samba服务器安装(总是忘,记录一下)