C Increase Subarray Sums
题意
t
n,x
a[],a[],a[]…
给你一个数列,要你求在不同取值不同的k的条件下,(k的意思就是你能加k个x,但没规定一定要把这些x全部加上) 和最大的连续子序列的和(这里的子序列没有规定长度)。(k的取值是0到n)
思路
用差分数组计算不同截取长度的和最大的连续子序列的和,针对“k的意思就是你能加k个x,但没规定一定要把这些x全部加上”这个问题,我们直接扫描不同截取长度的连续子序列的和最大值(这里解决中间参杂负数不知道取哪里、取多长造就和最大的情况),以及加上加上相同截取长度数量的x即可。(不加白不加,反正x>=0)
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int t,n,k,ans[N],a[N],per[N],x;
int main()
{
cin>>t;
while(t--){
cin>>n>>x;
for(k=1;k<=n;k++){cin>>a[k];per[k]=per[k-1]+a[k];}//差分数组per[]
for(k=1;k<=n;k++){
ans[k]=-1e10;
for(int i=k;i<=n;i++)
ans[k]=max(ans[k],per[i]-per[i-k]);//ans[k]代表连续k个长度的和的最大值(差分数组的重点用处)
}
for(k=0;k<=n;k++){
int cur=0;
for(int i=1;i<=n;i++)cur=max(cur,ans[i]+min(k,i)*x);针对不同的k考虑 截取多长的连续子序列结合考虑加几个x,造就的值最大
cout<<cur<<" ";//输出最大值
}
cout<<endl;
}
return 0;
}