SSL2521 数数 单调队列

来源:互联网 发布:linux 建立用户 编辑:程序博客网 时间:2024/06/12 00:22

2014年汕头市选拔赛普级组 数数

Time Limit:10000MS  Memory Limit:65536K
Total Submit:107 Accepted:31 
Case Time Limit:1000MS

Description



题目大意:如图所示

题解:记录前缀和sum[i],对于结尾为i的最大和,实际上是在sum[j](i-k<j<=i-1)中寻找一个最小值。

       于是我们可以维护一个sum的下标的单调队列,每次将当前最大值和sum[i]-sum[q[head]]取最大值即可



代码:

#include<algorithm>#include<cstdio>#include<cmath>#define MAXN 110000#define INF 100000009using namespace std;long long sum[MAXN];int q[MAXN];int n,k,head,tail;long long ans;int main(){scanf("%d%d",&n,&k);ans=-INF;q[0]=0;sum[0]=0;for (int i=1;i<=n;i++){int x;scanf("%d",&x);sum[i]=sum[i-1]+x;    while (q[head]<i-k)  head++;while (sum[i]<=sum[q[tail]]&&tail>=head)tail--;q[++tail]=i;ans=max(ans,sum[i]-sum[q[head]]);}printf("%lld",ans);return 0;}

0 0