题解:P11642 【MX-X8-T1】「TAOI-3」幸运草

先把话放在前头:如果你全错,请查看你有没有开 long long

思路

本题的关键问题在于确定替换哪个子区间(如果有的话)可以最大化总和。

考虑每个元素替换后的增益,即 $x$ 与当前元素的差值。我们需要找到一个子序列,使得这个子序列的增益总和最大。这个最大增益如果是正数则替换,否则为负数将不进行替换。

我们可以使用复杂度为 $O(n)$ 的 $\text{Kadane}$ 算法来解决这个问题。

注意这道题因为 $10^9 + 10^9$ 会超出 int 所以要开 long long,在进行比较时可以使用 0ll 作为 long long 类型的数字 $0$。

代码

这里使用 $tmp$ 维护当前子数组的最大增益,$ans$ 记录全局最大增益。

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
long long n, x, sum, tmp, ans, a[100005];
int main()
{
    cin >> n >> x;
    for (long long i = 1; i <= n; i++)
    {
        cin >> a[i];
        sum += a[i];
    }
    tmp = x - a[1];
    ans = tmp;
    for (long long i = 2; i <= n; i++)
    {
        tmp = max(x - a[i], tmp + x - a[i]);
        ans = max(ans, tmp);
    }
    cout << sum + max(0ll, ans) << endl;
    return 0;
}