---
# System prepended metadata

title: Educational Codeforces Round 123 (Div. 2) C(貪心)
tags: [' 貪心', 題解, ' 枚舉']

---

---
title: "Educational Codeforces Round 123 (Div. 2) C(貪心)"
tags: 題解, 枚舉, 貪心
---

https://codeforces.com/contest/1644/problem/C

#### 題意

給一包含正、負數的數列，以及一個正數 $x$。定義 $f(k)$ 為：在數列中選 $k$ 個不同位置，將此 $k$ 個數加上 $x$ 後，數列中的 maximum subarray 之值。

問：$f(k)$ 的最大值 for all $k$ from $0$ to $n$，各個 $k$ 值互相不影響。

#### 思路

對於長度為 $L$ 的 subarray，不管 $k$ 是多少，只需要考慮 $sum$ 最大的即可，因此先預處理出不同長度的 maximum subarray。

對於不同 $k$ 值，考慮所有可能的 subarray (即所有長度)，此 subarray 在當前 $k$ 的情況下可以增加的量為 $min(k, L) * x$。在所有 $k$ 的情況下考慮所有可能的長度 $L$ 即可得出答案。

#### Code

```python=1
def solve():
    n, x = map(int, input().split())
    A = list(map(int, input().split()))

    prefs = [0] + list(accumulate(A))

    maxs = [-INF for _ in range(n + 1)]

    for l in range(n):
        for r in range(l, n):
            maxs[r - l + 1] = max(maxs[r - l + 1], prefs[r + 1] - prefs[l])

    ans = [0 for _ in range(n + 1)]
    for k in range(n + 1):
        for l in range(n + 1):
            ans[k] = max(ans[k], maxs[l] + min(k, l) * x)

    print(*ans)

if __name__ == "__main__":
    for i in range(int(input())):
        solve()
```