#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll long long
using namespace std;
int n,k;
const int maxn=1e5+10;
ll sum[maxn];
int a[maxn];
ll dp[maxn];
ll s[maxn];
int q[maxn];
ll ans[maxn];
//void de_increase()
//{
// int l=0,r=-1,i,j;
// for(i=0;i<n;i++) //得到最大值
// {
// while(l<=r&&s[q1[r]]<s[i])r--;//递减数列 先插入
// q1[++r]=i;
// while(l<=r&&q1[l]<i-k+1)l++;//后判断
// ans[i]=s[q1[l]];
// cout<<l<<" "<<r<<endl;
// cout<<"q1[l]="<<q1[l]<<" "<<i<<" ans "<<ans[i]<<endl;
// }
//
// for(l=0,r=-1,i=1;i<=n;i++)///得到最小值
// {
// while(l<=r&&a[q2[r]]>a[i])r--;
// q2[++r]=i;
// while(l<r&&q2[l]<i-k+1)l++;
// ans2[i]=a[q2[l]];
// }
//}
int main()
{
while(cin>>n>>k)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sum[0]=0;
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+a[i];
memset(dp,0,sizeof(dp));
for(int i=1;i<=k;i++)
dp[i]=dp[i-1]+a[i];
int l=0,r=-1;
for(int i=0;i<=k;i++)//dp[0]=0;
{
s[i]=dp[i]-sum[i+1];//将dp[i]-sum[i+1]存进队列
while(l<=r&&s[q[r]]<s[i]) r--;
q[++r]=i;
while(l<=r&&q[l]<i-k+1)l++;//后判断
ans[i]=s[q[l]];
}
for(int i=k+1;i<=n;i++)
{
dp[i]=dp[i-1];
dp[i]=max(dp[i-1],ans[i-2]+sum[i]);
if(i<n)
{
s[i]=dp[i]-sum[i+1];
while(l<=r&&s[q[r]]<s[i]) r--;
q[++r]=i;
while(l<=r&&q[l]<i-k+1)l++;//后判断
ans[i]=s[q[l]];
}
}
printf("%lld\n",dp[n]);
}
}
05-21
05-14
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交