Submission #1336720

#TimeUsernameProblemLanguageResultExecution timeMemory
1336720m0nFeast (NOI19_feast)C++20
100 / 100
131 ms9824 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const ll INF = 1e18;
void testcase() {
    int n, k;
    cin >> n >> k;
    vector<ll> a(n), pref(n + 1);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
        pref[i + 1] = pref[i] + a[i];
    }
    auto check = [&](ll f) {
        vector<pair<ll, ll>> dp(n + 1, {-INF, INF});
        dp[0] = {0, 0};
        pair<ll, ll> lst = {0, 0}, val = {0, 0}, mx = {0, 0};
        for (int i = 0; i < n; ++i) {
            lst = max(lst, dp[i]);
            val = max(val, {lst.first - pref[i + 1], lst.second + 1});
            val = max(val, {lst.first - pref[i], lst.second + 1});
            dp[i + 1] = {val.first + pref[i + 1] - f, val.second};
            mx = max(mx, dp[i + 1]);
        }
        return mx;
    };
    ll l = -1e12, r = 1e12, ans = 0;
    while (l <= r) {
        ll mid = (l + r) / 2;
        auto [val, kk] = check(mid);
        if (kk >= k) {
            l = mid + 1;
            ans = val + 1ll * k * mid;
        } else {
            r = mid - 1;
        }
    }
    cout << ans << "\n";
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int tt = 1;
    // cin >> tt;
    while (tt--) {
        testcase();
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...