Submission #1296850

#TimeUsernameProblemLanguageResultExecution timeMemory
1296850ciao_gioThe short shank; Redemption (BOI21_prison)C++20
100 / 100
1738 ms343416 KiB
#include <bits/stdc++.h>

// #pragma GCC optimize("O3")

using namespace std;

struct Segment {
    int n;
    vector<array<int, 2>> t;

    Segment() {}
    Segment(int _n) : n(_n), t(2 * n) {
        for (int i = 0; i < n; i++) {
            t[i + n] = {-1, i};
        }
        for (int i = n - 1; i > 0; i--) {
            t[i] = max(t[2 * i], t[2 * i + 1]);
        }
    }

    void update(int i) {
        for (t[i += n][0]++; i > 1; i /= 2) {
            t[i / 2] = max(t[i], t[i ^ 1]);
        }
    }

    int query(int l, int r) {
        array<int, 2> ans = {-1, -1};
        for (l += n, r += n; l < r; l /= 2, r /= 2) {
            if (l & 1) ans = max(ans, t[l++]);
            if (r & 1) ans = max(ans, t[--r]);
        }
        return ans[1];
    }
};

int infetti(int N, int D, int S, vector<int> t) {
    Segment T(N);

    vector<int> dp(N, 0);

    int ans = 0;
    
    unordered_map<int, vector<int>> M;
    set<int> R;

    for (int i = 0; i < N; i++) {
        if (t[i] <= S) {
            R.insert(i);
            M[i + S - t[i]].push_back(i);
            for (int j: M[i]) {
                R.erase(j);
            }
            T.update(i);
        }
        else {
            if (R.empty()) {
                ans++;
            }
            else {
                int x = *prev(R.end());
                int y = T.query(x, i);
                T.update(y);
                dp[y]++;
            }

            for (int j: M[i]) {
                R.erase(j);
            }
        }
    }

    sort(begin(dp), end(dp), [&] (int i, int j) { return i > j; });

    for (int i = 0; i < min(N, D); i++) {
        ans += dp[i];
    }

    return N - ans;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    int N, D, T; cin >> N >> D >> T;
    vector<int> t(N);
    for (int i = 0; i < N; i ++) cin >> t[i];

    cout << infetti(N, D, T, t) << '\n';
}
#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...