#include <cstdio>
#include <cstring>
#define maxn 5000005
#define LL long long
LL a[maxn];
LL sum[maxn];
LL dp[maxn];
int Q[maxn];
int head,tail;
LL get0(int p)
{
return dp[p]-sum[p]+p*a[p+1];
}
LL get1(int p,int q)
{
return get0(p)-get0(q);
}
LL get2(int p,int q)
{
return a[p+1]-a[q+1];
}
void pop(int i)
{
while(head+1<tail&&get1(Q[head+1],Q[head])<=i*get2(Q[head+1],Q[head])) head++;
}
void push(int i)
{
while(head+1<tail&&(get1(Q[tail-1],Q[tail-2])*get2(i,Q[tail-1]))>=(get1(i,Q[tail-1])*get2(Q[tail-1],Q[tail-2]))) tail--;
Q[tail++]=i;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,k;
int i;
scanf("%d%d",&n,&k);
for(sum[0]=0,i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
memset(dp,0,sizeof(dp));
head=tail=0;
for(int i=k;i<2*k;i++)
{
dp[i]=sum[i]-i*a[1];
}
push(k);
for(i=2*k;i<=n;i++)
{
pop(i);
dp[i]=dp[Q[head]]-sum[Q[head]]-(i-Q[head])*a[Q[head]+1]+sum[i];
push(i-k+1);
}
printf("%lld\n",dp[n]);
}
return 0;
}
POJ 3709 K-Anonymous Sequence
最新推荐文章于 2021-11-13 11:04:15 发布