Submission #1173112

#TimeUsernameProblemLanguageResultExecution timeMemory
1173112yegorvkFeast (NOI19_feast)C++20
100 / 100
71 ms2632 KiB
#ifdef ONLINE_JUDGE
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#endif

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

ll k, n;
vector<ll> a;

struct state {
    ll ans;
    int cnt;

    bool operator<(const state &s) const {
        return make_pair(ans, cnt) < make_pair(s.ans, s.cnt);
    }

    state operator+(ll v) const {
        return {ans+v, cnt};
    }

    state operator+(pair<ll, int> v) const {
        return {ans+v.first, cnt+v.second};
    }

    ll comp(ll p) {
        return ans + p * cnt;
    }
};

state test(ll cost) {
    state dp_old[2], dp_new[2];

    dp_old[0] = {0, 0};
    dp_old[1] = {a[0] - cost, 1};

    for (int i = 1; i < n; ++i) {
        dp_new[0] = max(dp_old[0], dp_old[1]);
        dp_new[1] = max(dp_old[1] + a[i], dp_old[0] + make_pair(a[i] - cost, 1));
        swap(dp_old, dp_new);
    }

    return max(dp_old[0], dp_old[1]);
}

void solve() {
    cin >> n >> k;

    a.resize(n);

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

    ll l = 0, r = 1e14;
    ll ans = 0;
    int c;

    while (r - l > 1) {
        ll m = (l + r) / 2;
        auto s = test(m);
        c = s.cnt;
        if (c >= k)
            l = m;
        else
            r = m - 1;
    }

    ans = max(test(l).comp(l), test(r).comp(r));

    cout << ans << '\n';
}

int main() {
    ios_base::sync_with_stdio(false);

    cin.tie(nullptr);
    cout.tie(nullptr);

    solve();

    // ll t;
    // cin >> t;
    //
    // while (t--) solve();

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