Submission #875112

#TimeUsernameProblemLanguageResultExecution timeMemory
875112rakkoon69Feast (NOI19_feast)C++17
100 / 100
74 ms8176 KiB
#include <bits/stdc++.h>

#define int long long
#define ll long long
#define II pair<int, int>
#define fs first
#define sc second
#define endl '\n'

#define mp(x, y) make_pair(x, y)
#define sz(x) ((int) (x.size()))
#define forlr(i, l, r) for(int i = l; i <= r; ++i)
#define forrl(i, r, l) for(int i = r; i >= l; --i)
#define show(v) for(auto i : v) cout << i << " "; cout << endl;
#define showlr(v, l, r) for (int i = l; i <= r; i++) cout << v[i] << " "; cout << endl;
#define all(v) v.begin(), v.end()
#define Unique(v) v.erase(unique(all(v)), v.end());

const long long LINF = 1ll << 60;
const int INF = 1 << 30;
const int N = 3e5 + 5;

using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); 

int n, k;
int a[N], p[N];

II choose(II A, II B) {
    if(A.fs == B.fs) return A.sc < B.sc ? A : B;
    return A.fs > B.fs ? A : B;    
}

II calc(int cost) {
    II take = {0, 0}, best = {0, 0};

    forlr(i, 1, n) {
        best = choose(best, {take.fs + p[i] - cost, take.sc + 1});
        take = choose(take, {best.fs - p[i], best.sc});
    }

    return best;
}

int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    cin >> n >> k;

    forlr(i, 1, n) {
        cin >> a[i];
        p[i] = p[i - 1] + a[i];
    }

    int ans = 0;
    int lo = 0, hi = 3e14;
    while(lo <= hi) {
        int mid = (lo + hi) >> 1;
        II v = calc(mid);

        if(v.sc > k) lo = mid + 1;
        else hi = mid - 1, ans = v.fs + k * mid;
    }

    cout << ans << endl;

    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...