Submission #572735

#TimeUsernameProblemLanguageResultExecution timeMemory
572735CyanmondThe short shank; Redemption (BOI21_prison)C++17
100 / 100
1016 ms163560 KiB
#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

constexpr int inf = 1000000100;

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define REP3(i, l, r) for (int i = (l); i < (r); ++i)
#define RVP(i, n) for (int i = (n - 1); i >= 0; --i)

#define ALL(x) (x).begin(), (x).end()
int main() {
    int N, D, T;
    cin >> N >> D >> T;
    vector<int> t(N);
    for (auto &e : t) cin >> e;

    stack<int> stk;
    vector<int> ml(N, N);
    int count_v = 0;
    REP(i, N) {
        while ((not stk.empty()) and stk.top() + (T - t[stk.top()]) < i) stk.pop();
        if (t[i] <= T) {
            ++count_v;
            while ((not stk.empty()) and t[stk.top()] + i >= t[i] + stk.top()) stk.pop();
            stk.push(i);
        } else {
            if (stk.empty()) continue;
            ++count_v;
            ml[i] = stk.top();
        }
    }
    while (not stk.empty()) stk.pop();

    vector<int> b(N, N);
    RVP(i, N) {
        if (ml[i] == N) continue;
        while ((not stk.empty()) and ml[stk.top()] >= i) stk.pop();
        if (not stk.empty())
            b[i] = stk.top();
        else
            b[i] = N + 1; // base

        while ((not stk.empty()) and ml[stk.top()] >= ml[i]) stk.pop();
        stk.push(i);
    }

    vector<vector<int>> g(N);
    REP(i, N) if (b[i] < N) g[b[i]].push_back(i);

    vector<int> madpt(N, -1), chd(N, -1);
    {
        auto dfs = [&](auto &&self, const int v) -> void {
            if (madpt[v] != -1) return;
            madpt[v] = 1;
            for (const int t : g[v]) {
                self(self, t);
                if (madpt[v] < madpt[t] + 1) {
                    madpt[v] = madpt[t] + 1;
                    chd[v] = t;
                }
            }
            return;
        };
        REP(i, N) dfs(dfs, i);
    }
    vector<pair<int, int>> vs;
    REP(i, N) if (madpt[i] != -1) vs.push_back({madpt[i], i});
    sort(ALL(vs), greater());
    vector<bool> used(N);
    int sum = 0;
    REP(i, (int)size(vs)) {
        if (used[vs[i].second]) continue;
        sum += vs[i].first;
        int now = vs[i].second;
        while (now != -1) {
            used[now] = true;
            now = chd[now];
        }
        --D;
        if (D == 0) break;
    }
    cout << count_v - sum << endl;
}
#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...