C. Increase Subarray Sums-Educational Codeforces Round 123 (Rated for Div. 2)

本文详细解析了Codeforces竞赛中的一道题目C.IncreaseSubarraySums。题目要求计算在给定数组中增加特定数量元素的值后,能获得的最大子数组和。通过动态规划的方法,预处理前缀和和特定区间最值,然后进行加值操作,得到最大子数组和。尽管题目看似复杂,但暴力解法在给定的时间和空间限制下并未超时,展示了动态规划在解决这类问题上的高效性。
摘要由CSDN通过智能技术生成

Problem - 1644C - Codeforces

C. Increase Subarray Sums

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

You are given an array a1,a2,…,ana1,a2,…,an, consisting of nn integers. You are also given an integer value xx.

Let f(k)f(k) be the maximum sum of a contiguous subarray of aa after applying the following operation: add xx to the elements on exactly kk distinct positions. An empty subarray should also be considered, it has sum 00.

Note that the subarray doesn't have to include all of the increased elements.

Calculate the maximum value of f(k)f(k) for all kk from 00 to nn independently.

Input

The first line contains a single integer tt (1≤t≤50001≤t≤5000) — the number of testcases.

The first line of the testcase contains two integers nn and xx (1≤n≤50001≤n≤5000; 0≤x≤1050≤x≤105) — the number of elements in the array and the value to add.

The second line contains nn integers a1,a2,…,ana1,a2,…,an (−105≤ai≤105−105≤ai≤105).

The sum of nn over all testcases doesn't exceed 50005000.

Output

For each testcase, print n+1n+1 integers — the maximum value of f(k)f(k) for all kk from 00 to nn independently.

Example

input

Copy

3
4 2
4 1 3 2
3 5
-2 -7 -1
10 2
-6 -1 -2 4 -6 -1 -4 4 -5 -4

output

Copy

10 12 14 16 18
0 4 4 5
4 6 6 7 7 7 7 8 8 8 8

Note

In the first testcase, it doesn't matter which elements you add xx to. The subarray with the maximum sum will always be the entire array. If you increase kk elements by xx, k⋅xk⋅x will be added to the sum.

In the second testcase:

  • For k=0k=0, the empty subarray is the best option.
  • For k=1k=1, it's optimal to increase the element at position 33. The best sum becomes −1+5=4−1+5=4 for a subarray [3,3][3,3].
  • For k=2k=2, it's optimal to increase the element at position 33 and any other element. The best sum is still 44 for a subarray [3,3][3,3].
  • For k=3k=3, you have to increase all elements. The best sum becomes (−2+5)+(−7+5)+(−1+5)=5(−2+5)+(−7+5)+(−1+5)=5 for a subarray [1,3][1,3].
  • ============================================================================================================================================

关于本题复杂度我是真的没搞懂为什么不会超时,暴力解法竟然如此快。直接预处理前缀和和特定区间和最值,最后再进行加x操作即可

# include<iostream>

typedef long long int ll;
using namespace std;

ll dp[5050];
ll a[5050];
ll sum[5050];

int main ()
{

      int t;
      cin>>t;

      while(t--)
      {

          int n,x;

          cin>>n>>x;


          for(int i=1;i<=n;i++)
          {
              cin>>a[i];

              sum[i]=sum[i-1]+a[i];

          }
          for(int L=1;L<=n;L++)
          {
              dp[L]=-0x7f7f7f7f7f7f7f7f;

              for(int i=1;i+L-1<=n;i++)
              {
                  dp[L]=max(dp[L],sum[i+L-1]-sum[i-1]);

              }
          }
          ll ans=-0x7f7f7f7f7f7f7f7f;


          for(int i=0;i<=n;i++)
          {
              ans=0;
              for(int L=1;L<=n;L++)
              {

                  ans=max(ans,dp[L]+min(i,L)*x);

              }

              cout<<ans<<" ";

          }

          cout<<endl;

      }


    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qinsanma and Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值