传送

时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format:%lld

题目描述

Today HH finds a non-decreasing sequence(a1,a2…an,ai≤ai+1), he
thinks it’s not beautiful so he wants to make it beautiful. To make
it, HH will choose exactly one number and move it forward at least k
steps(i.e. you can move ai to aj if k≤i−j), and then he defines the
beautiful value F(n) as HH asks you to calculate max(F(n))

输入描述:

The first line contains an positive integer T(1≤T≤10), represents
there are T test cases. For each test case: The first line
contains two positive integers n,k(1≤n≤105,1≤k<n),the length of the
sequence ,the least steps you need to move. The second line contains
n integers a1,a2…an(1≤ai≤108) - the sequence.

输出描述:

For each test case, you should output the max F(n).

示例1
输入

3
5 3
1 1 3 4 5
5 2
1 1 3 4 5
5 1
1 1 3 4 5

输出

46
50
53

说明

In the first example, you can move the fifth number 4 for 3 steps and
make the sequence become [4,1,1,3,5], then the beautiful value is
4×1+1×2+1×3+3×4+5×5=46. You can also move the fifth number to make it
become [1,5,1,3,4], the beautiful value is also 46. In the second
example, you can move the fifth number 5 for 2 steps and make the
sequence become [1,1,5,3,4] In the second example, you can move the
second number 1 for 1 steps and then the sequence is still [1,1,3,4,5]

备注:

scanf is commended。

题解:
比如:A B C D E
对应:1 2 3 4 5
此时的值为ans1=1A+2B+3C+4D+5E
现在D移动到B前面,移动了两步
A D B C E
此时的值:ans2 = 1
A+2D+3B+4C+5E
=1A+2B+3C+4D+5E-3D+(B+C+D)
观察ans1与ans2相比有什么变化
发生改变就是减去这个数字的k倍,再加上被移动数字(共k个)的和
因为D向前移动k,说明Di–>D(i-k)
BC因为D向前而被拱到后面,从Bi—>b(i+1)
被移动数字之和我们可以用前缀和pre实现
看代码:

#include<bits/stdc++.h>
#define for(w) for(int i=w;i<=n;i++)
using namespace std;
const int maxn=1e5+3;
long long int sum[maxn],pre[maxn];
long long int a[maxn];
long long tot=0,ans=0;
int main()
{
   
	long long t,n,k;
	//cin>>t;
	scanf("%lld",&t);
	while(t--)
	{
   
		tot=0;
		ans=0;
		memset(pre,0,sizeof(pre));
		
		scanf("%lld%lld",&n,&k);
		for(1)
		{
   
		// cin>>a[i];
		scanf("%lld",&a[i]);
			ans=ans+a[i]*i;
	
			
		}
		for(1)
		{
   
					pre[i]=pre[i-1]+a[i];
		}
		for((k+1))
		{
   
			tot=max(tot,ans-a[i]*k+(pre[i-1]-pre[i-k-1]));
			
		}
		cout<<tot<<endl;
	}
}