Submission #1137585

#TimeUsernameProblemLanguageResultExecution timeMemory
1137585anmattroiFeast (NOI19_feast)C++20
100 / 100
123 ms11004 KiB
#include<bits/stdc++.h>
#define maxn 300005
#define fi first
#define se second
using namespace std;
using ii = pair<int, int>;
using li = pair<int64_t, int>;

int n, k;
int a[maxn];

li dp[maxn][2];

li solve_lambda(int64_t x) {
    dp[0][1] = {LLONG_MIN/2, 0};

    for (int i = 1; i <= n; i++) {
        dp[i][0] = max(dp[i-1][0], dp[i-1][1]);
        dp[i][1] = max(li{dp[i-1][1].fi+a[i], dp[i-1][1].se}, li{dp[i-1][0].fi+a[i]-x, dp[i-1][0].se+1});
    }

    return max(dp[n][0], dp[n][1]);
}

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

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

    int64_t lo = 0, hi = 100000000000000000LL;
    while (hi-lo>1) {
        int64_t mid = (lo+hi)>>1LL;
        if (solve_lambda(mid).se >= k) lo = mid;
        else hi = mid;
    }
    cout << solve_lambda(lo).fi + k*lo;
}
#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...