Submission #1290477

#TimeUsernameProblemLanguageResultExecution timeMemory
1290477MinhKienFeast (NOI19_feast)C++20
100 / 100
93 ms9836 KiB
#include <iostream>

using namespace std;

#define ll long long

const int N = 3e5 + 10;

int n, k, MinPre, it[N], f[N][2], F;
ll a[N], dp[N][2], DP;

void dodp(ll delta) {
    dp[1][0] = 0;
    dp[1][1] = a[1] - delta;
    f[1][1] = 1;
    for (int i = 2; i <= n; ++i) {
        if (dp[i - 1][0] + a[i] - delta > dp[i - 1][1] + a[i]) {
            dp[i][1] = dp[i - 1][0] + a[i] - delta;
            f[i][1] = f[i - 1][0] + 1;
        } else {
            dp[i][1] = dp[i - 1][1] + a[i];
            f[i][1] = f[i - 1][1];
        }

        if (dp[i - 1][0] > dp[i - 1][1]) {
            dp[i][0] = dp[i - 1][0];
            f[i][0] = f[i - 1][0];
        } else {
            dp[i][0] = dp[i - 1][1];
            f[i][0] = f[i - 1][1];
        }
    }

    if (dp[n][1] > dp[n][0]) {
        DP = dp[n][1];
        F = f[n][1];
    } else {
        DP = dp[n][0];
        F = f[n][0];
    }
}

int main() {
    cin.tie(0); cout.tie(0);
    ios_base::sync_with_stdio(false);

    cin >> n >> k;
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
    }

    ll l = 0, r = 1e12, ans = l;
    while (l <= r) {
        ll mid = (l + r) >> 1;

        dodp(mid);
        if (F <= k) {
            r = mid - 1;
            ans = mid;
        } else {
            l = mid + 1;
        }
    }

    dodp(ans);
    cout << max(0ll, DP + (ll)F * ans) << "\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...