Submission #538266

#TimeUsernameProblemLanguageResultExecution timeMemory
538266StickfishThe short shank; Redemption (BOI21_prison)C++17
10 / 100
122 ms88304 KiB
#include <iostream>
#include <vector>
using namespace std;

const int MAXN = 2e6 + 123;
vector<int> edg[MAXN];
int rt[MAXN];

int init(int n) {
    int t;
    cin >> t;
    vector<int> a(n);
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    vector<pair<int, int>> stck;
    vector<int> vl(n);
    int ans = 0;
    for (int i = 0; i < n; ++i) {
        stck.push_back({a[i], i});
        while (stck.size() && t - stck.back().first < i - stck.back().second)
            stck.pop_back();
        if (stck.size()) {
            vl[i] = stck.back().second;
        } else {
            ++ans;
            vl[i] = n + 1;
        }
    }
    //for (int i = 0; i < n; ++i)
        //cout << vl[i] << ' ';
    //cout << endl;
    vector<int> way;
    for (int i = n - 1; i >= 0; --i) {
        while (way.size() && vl[way.back()] > i) {
            way.pop_back();
        }
        if (vl[i] >= i) {
            rt[i] = -1;
            continue;
        }
        if (vl[i] < i && way.size()) {
            rt[i] = way.back();
            edg[way.back()].push_back(i);
        } else {
            rt[i] = 0;
            edg[0].push_back(i);
        }
        way.push_back(i);
    }
    //for (int i = 0; i < n; ++i) {
        //cout << rt[i] << ' ';
    //}
    //cout << endl;
    return ans;
}

vector<int>* unite(vector<int>* a, vector<int>* b, int d) {
    int n = a->size();
    if ((*a)[0]) {
        for (int i = 1; i < n; ++i)
            (*a)[i] += (*a)[0];
        (*a)[0] = 0;
    }
    int m = b->size();
    if ((*b)[0]) {
        for (int i = 1; i < m; ++i)
            (*b)[i] += (*b)[0];
        (*b)[0] = 0;
    }
    if (n < m)
        swap(a, b);
    int sz = min(d + 1, n + m - 1);
    a->resize(sz);
    for (int i = sz - 1; i > 0; --i) {
        for (int j = 0; j < m && j <= i; ++j) {
            (*a)[i] = max((*a)[i], (*a)[i - j] + (*b)[j]);
        }
    }
    delete b;
    return a;
}

vector<int>* dfs(int v, int d) {
    if (edg[v].empty()) {
        vector<int>* ans = new vector<int>(2);
        (*ans)[1] = 1;
        return ans;
    }
    vector<int>* ans = nullptr;
    for (auto u : edg[v]) {
        if (!ans) {
            ans = dfs(u, d);
        } else {
            ans = unite(ans, dfs(u, d), d);
        }
    }
    ++(*ans)[0];
    //cout << v << ": ";
    //for (auto x : ans)
        //cout << x << ' ';
    //cout << endl;
    return ans;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n, d;
    cin >> n >> d;
    int neut = init(n);
    vector<int>* vvv = dfs(0, d);
    int ans = vvv->front() + vvv->back();
    //cout << "(" << ans << ' ' << neut << ") " << endl;
    cout << n - ans - neut + 1 << 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...