Submission #1267755

#TimeUsernameProblemLanguageResultExecution timeMemory
1267755madamadam3Stove (JOI18_stove)C++20
100 / 100
30 ms3572 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long int
using pi = pair<int, int>;
const int INF = 4e18;

signed main() { // is this alien trick ??
    cin.tie(0)->sync_with_stdio(0);

    int n, k; cin >> n >> k;
    vector<int> times(n); 

    for (int i = 0; i < n; i++) {
        cin >> times[i]; 
        times[i]--;
    }

    auto g = [&](int la) {
        vector<int> DP(n, INF), cnt(n, -INF), prefix_min(n+1, INF);
        DP[0] = 1+la; cnt[0] = 1;

        int pb = 0, pc = 0, pv = -times[0] + 1 + la;

        for (int i = 1; i < n; i++) {
            int cand = DP[i-1] - times[i] + 1 + la;
            if (cand < pv || cand == pv && cnt[i-1] < pc) {
                pc = cnt[i-1];
                pv = cand;
                pb = i;
            }

            DP[i] = times[i] + pv;
            cnt[i] = pc+1;
        }

        return make_pair(DP[n-1], cnt[n-1]);
    };

    int lo = 0, hi = 1e8;
    while (lo < hi) {
        int mid = lo + (hi - lo) / 2;
        
        pi fx = g(mid);
        if (fx.second > k) {
            lo = mid + 1;
        } else {
            hi = mid;
        }
    }

    pi r1 = g(lo), r2 = g(lo-1);
    cout << max(r1.first - k * lo, r2.first - k * (lo-1)) << "\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...