Submission #1307416

#TimeUsernameProblemLanguageResultExecution timeMemory
1307416msab3fBitaro’s Party (JOI18_bitaro)C++20
0 / 100
3 ms836 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAX_N = 100000 + 10;
const int SQ = 160;

int n, m, q;
vector<int> adj[MAX_N];
vector<pair<int, int>> fars[MAX_N];
bool block[MAX_N], mark[MAX_N];

int main() {
    cin >> n >> m >> q;

    for (int i = 1, s, e; i <= m; ++i) {
        cin >> s >> e;
        adj[e].push_back(s);
    }

    for (int i = 1; i <= n; ++i) {
        fars[i].push_back({0, i});

        for (int j : adj[i]) {
            vector<pair<int, int>> new_fars;

            for (int pi = 0, pj = 0; pi + pj < int(fars[i].size() + fars[j].size()) && new_fars.size() < SQ;) {
                if (pi < fars[i].size() && (pj == fars[j].size() || fars[i][pi].first >= fars[j][pj].first + 1)) {
                    if (!mark[fars[i][pi].second]) {
                        new_fars.push_back(fars[i][pi]);
                        mark[fars[i][pi].second] = true;
                    }
                    ++pi;
                } else {
                    if (!mark[fars[j][pj].second]) {
                        new_fars.push_back(fars[j][pj]);
                        ++new_fars.back().first;
                        mark[fars[j][pj].second] = true;
                    }
                    ++pj;
                }
            }

            fars[i] = new_fars;

            for (auto [d, u] : fars[i]) {
                mark[u] = false;
            }
        }
    }

    while (q--) {
        int t, y;
        cin >> t >> y;

        vector<int> blocks(y, 0);
        for (int &c : blocks) {
            cin >> c;
            block[c] = true;
        }

        int res = -1;

        if (y < SQ) {
            for (auto [d, u] : fars[t]) {
                if (!block[u]) {
                    res = d;
                    break;
                }
            }
        } else {
            int d[t + 1];
            for (int i = 1; i <= t; ++i) {
                d[i] = block[i] ? -1 : 0;
                for (int j : adj[i]) {
                    d[i] = max(d[i], d[j] + 1);
                }
            }
            res = d[t];
        }

        cout << res << '\n';

        for (int c : blocks) {
            block[c] = false;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...