SSL 2521 数数
来源:互联网 发布:karunesh 知乎 编辑:程序博客网 时间:2024/05/21 11:06
Description
给出一个长度为N的整数序列,选择长度不超过K的段,使总和最大
Simple Input
3 21 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);}
0 0
- SSL 2521 数数
- SSL 2521 数数
- SSL 2521 数数
- 数数 ssl 2521 单调队列
- SSL P2209 数数
- SSL 2521 2014年汕头市选拔赛普级组 数数
- 数数
- 数数
- 数数
- 数数
- 数数
- 数数
- 数数
- 数数
- 数数
- 数数
- 数数
- 数数
- Hrbust 2143 积分大小【dp】
- Leetcode | Binary Tree Inorder Traversal
- 如何实现UDP的可靠传输
- LeetCode 189. Rotate Array
- R语言:lengths计算列表list中元素的个数
- SSL 2521 数数
- 关于泛型程序设计和c++标准模板库
- JavaSE学习(10) 集合框架
- 116. Populating Next Right Pointers in Each Node
- Leetcode | Basic Calculator
- 349. Intersection of Two Arrays#2(Done)
- java学习入门
- 【PHP】10个值得深思的PHP面试问题
- Mac VMWare Fusion安装ghost win7注意事项