玛丽莎来到魔法森林采摘蘑菇。
魔法森林可以用X轴上编号为1到n的n个点来表示。在玛丽莎开始之前,她的朋友帕秋莉用魔法检测了每个点上的蘑菇的初始数量,用a1,a2,...,an表示。
玛丽莎可以在第0分钟时从森林的任何一点开始。每分钟,以下情况依次发生。
她从x点移动到y点(|x-y|≤1,可能y=x)。
她收集了y点上的所有蘑菇。
森林中的每一个点上都会出现一个新的蘑菇。
请注意,她不能在第0分钟收集蘑菇。
现在,玛丽莎想知道她在k分钟后能采到的蘑菇的最大数量。
输入
每个测试包含多个测试案例。第一行包含一个整数t(1≤t≤104)--测试案例的数量。测试用例的描述如下。
每个测试用例的第一行包含两个整数n,k(1≤n≤2⋅105,1≤k≤109)--分别是有蘑菇的位置数和Marisa的时间。
每个测试案例的第二行包含n个整数a1,a2,...,an(1≤ai≤109)--1,2,...,n点上蘑菇的初始数量。
保证所有测试用例的n之和不超过2⋅105。
输出
对于每个测试案例,打印出Marisa在k分钟后能采到的最大蘑菇数。
例子
输入复制
4
5 2
5 6 1 2 3
5 7
5 6 1 2 3
1 2
999999
5 70000
1000000000 1000000000 1000000000 1000000000 1000000000
outputCopy
12
37
1000000
5000349985
备注
测试案例1。
玛丽莎可以从x=2开始。在第一分钟内,她移动到x=1并收集5个蘑菇。蘑菇的数量将是[1,7,2,3,4]。在第二分钟,她移动到x=2,收集了7个蘑菇。蘑菇的数量将是[2,1,3,4,5]。2分钟后,玛丽莎收集了12个蘑菇。
可以证明,收集超过12个蘑菇是不可能的。
测试案例2。
这是她可能的移动路径之一。
2→3→2→1→2→3→4→5
可以证明,不可能收集超过37个蘑菇。
题解:
如果k<=n的情况很好想,肯定是找到区间和最大的段,因为初始有值的点肯定是优的
但是k>n
如果我们让时间刚好到时刚好遍历收割完一遍,那么增长速率就是n,即全部。如果当时间到时我们的位置在除端点外的任意位置的话,增长速率的总体就会减少,因为有几个在增长时没有算上,可以拿样例2来举例子,假设从时间刚开始时就从左端出发,跑到最右端后继续拐回来,走两步后停下来,时间到了,那么前的数增长的就没算上,(这里要明白不管最后到端点或者任意位置,总会必定舍弃有n*(n+1)/2个菜,因为跑过后还在增长。那么全部菜的增长就是n*k,可以用 总共的 - 舍弃的 = 得到的)
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define int long long
//1 1 3 3 3
int n,ans;
int a[200050];
void solve()
{
int n,k;
cin >> n >>k;
for(int i = 1;i <= n;i++)
{
cin >> a[i];
a[i] = a[i-1] + a[i];
}
int ans = 0;
if(k <= n)
{
for(int i = k;i <= n;i++)
{
ans = max(a[i]-a[i-k],ans);
}
cout<<ans+k*(k-1)/2<<"\n";
}
else
{
ans = a[n];
ans += n*k - n*(n+1)/2;
cout<<ans<<"\n";
}
}
signed main()
{
int t = 1;
cin >> t;
while(t--)
{
solve();
}
}
//2 5
//3
//9 7
//2 3 4 3
//1 2 3 4 5
// 3