Submission #1211276

#TimeUsernameProblemLanguageResultExecution timeMemory
1211276maltaFeast (NOI19_feast)C++20
4 / 100
99 ms10824 KiB
#include <bits/stdc++.h>
using namespace std;
using ll   = long long;
using i128 = __int128_t;

pair<i128,int> dpc(const vector<ll>& pfs, i128 C) {
    int n = pfs.size() - 1;
    vector<i128> dp(n+1, (i128)LLONG_MIN * 2);
    vector<int>  cnt(n+1, 0);
    dp[0] = 0; cnt[0] = 0;
    i128 best_val = 0;
    int   best_cnt = 0;
    for (int i = 1; i <= n; i++) {
        dp[i]  = dp[i-1];
        cnt[i] = cnt[i-1];
        i128 cand = best_val + (i128)pfs[i] + C;
        int   c2   = best_cnt + 1;
        if (cand > dp[i]) {
            dp[i]  = cand;
            cnt[i] = c2;
        }
        i128 cur = dp[i] - (i128)pfs[i];
        if (cur > best_val) {
            best_val = cur;
            best_cnt = cnt[i];
        }
    }
    return {dp[n], cnt[n]};
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, k;
    cin >> n >> k;
    vector<ll> a(n+1), pfs(n+1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        pfs[i] = pfs[i-1] + a[i];
    }
    if (*max_element(a.begin()+1, a.end()) <= 0) {
        cout << 0 << "\n";
        return 0;
    }
    auto [dp0_0, k0] = dpc(pfs, 0);
    if (k0 <= k) {
        cout << (long long)dp0_0 << "\n";
        return 0;
    }

    i128 lo = 0, hi = (i128)1e14;
    i128 c0 = 0, dp0 = 0;
    while (lo <= hi) {
        i128 mid = lo + ((hi - lo) >> 1);
        auto [dpC, kC] = dpc(pfs, mid);
        if (kC >= k) {
            c0  = mid;
            dp0 = dpC;
            hi  = mid - 1;
        } else {
            lo = mid - 1;
        }
    }

    i128 ans128 = dp0 - c0 * k;
    cout << (long long)ans128 << "\n";
    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...