题解:P11963 [GESP202503 六级] 环线

· · 题解

提供一个空间复杂度 O(1) 的做法。

解题思路

本题可以分为两种情况考虑

将上面两种情况综合起来,也就是求它们的最小值,就能得到最终答案。
注意特判全是负数的情况,不然会得到 70 分。

AC 代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t, n, maxdp, mindp, sum, minn = LLONG_MAX, maxx = LLONG_MIN, maxn = LLONG_MIN;
signed main() {
    cin >> t;
    while (t--) {
        cin >> n;
        sum += n;
        maxn = max(maxn, n);
        maxdp = max(n, maxdp + n);
        maxx = max(maxdp, maxx);
        mindp = min(n, mindp + n);
        minn = min(mindp, minn);
    }
    if (maxn < 0) cout << maxn;
    else cout << max(sum - minn, maxx);
    return 0;
}