Submission #1139913

#TimeUsernameProblemLanguageResultExecution timeMemory
1139913minhnguyent546Feast (NOI19_feast)C++20
21 / 100
1093 ms7232 KiB
/**            
 * author      minhnguyent546
 * created_at  Sun, 2025-01-26 08:09:26
 * problem     https://oj.uz/problem/view/NOI19_feast
 **/           
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include "cp/debug.h"
#else
#define debug(...)
#define cerr if (false) cerr
#endif

int n, k;
vector<int> arr;
vector<long long> pref;
void read() {
    cin >> n >> k;
    arr.resize(n);
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
    }

    pref.resize(n + 1);
    for (int i = 0; i < n; ++i) {
        pref[i + 1] = pref[i] + arr[i];
    }
}

long long sum(int l, int r) {
    assert(0 <= l && l <= r && r < n);
    return pref[r + 1] - pref[l];
}


const long long INF_LL = 0x3f3f3f3f3f3f3f3f;

namespace brute {
bool check() {
    return n <= 2000;
}
void solve() {
    cerr << " *** [BRUTE] *** " << '\n';

    vector<long long> dp(n + 1, -INF_LL);
    vector<long long> ndp(n + 1);
    dp[0] = 0;
    for (int j = 0; j <= k; ++j) {
        for (int i = 1; i <= n; ++i) {
            ndp[i] = ndp[i - 1];
            if (j > 0) {
                for (int z = 0; z < i; ++z) {
                    ndp[i] = max(ndp[i], dp[z] + max(0LL, sum(z, i - 1)));
                }
            }
        }
        dp.swap(ndp);
    }
    cout << dp[n] << '\n';

}
} // namespace brute

namespace sub7 {
bool check() {
    return true;
}
void solve() {
    cerr << " *** [SUB 7] *** " << '\n';
    long long low = -(long long) 1e18, high = 0;

    vector<long long> dp(n + 1);
    vector<int> min_seg(n + 1);
    auto gud = [&](long long lambda) -> bool {
        fill(dp.begin(), dp.end(), -INF_LL);
        dp[0] = 0;
        min_seg[0] = 0;
        for (int i = 1; i <= n; ++i) {
            dp[i] = dp[i - 1];
            min_seg[i] = min_seg[i - 1];
            for (int z = 0; z < i; ++z) {
                long long cost = sum(z, i - 1) + lambda;
                long long nval = dp[z] + cost;
                if (nval > dp[i]) {
                    dp[i] = nval;
                    min_seg[i] = min_seg[z] + 1;
                } else if (nval == dp[i]) {
                    min_seg[i] = min(min_seg[i], min_seg[z] + 1);
                }
            }
        }
        // cerr << "lambda = " << lambda << ", min_seg[n] = " << min_seg[n] << ", dp[n] = " << dp[n] << '\n';
        return min_seg[n] <= k;
    };
    while (low < high) {
        long long mid = low + (high - low + 1) / 2;
        if (gud(mid)) {
            low = mid;
        } else {
            high = mid - 1;
        }
    }
    long long lambda = high;
    gud(lambda);
    long long ans = dp[n] - lambda * k;
    cout << ans << '\n';
}
} // namespace sub7


int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cin.exceptions(cin.failbit);
    read();

    #ifdef LOCAL
        sub7::solve(); return 0;
        brute::solve(); return 0;
    #endif

    if (brute::check()) {
        brute::solve(); return 0;
    }

    if (sub7::check()) {
        sub7::solve(); return 0;
    }

    assert(false);
    
    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...