Submission #1196222

#TimeUsernameProblemLanguageResultExecution timeMemory
1196222Double_SlashBitaro’s Party (JOI18_bitaro)C++20
100 / 100
1107 ms420920 KiB
#include <bits/stdc++.h>

using namespace std;
using pint = pair<int, int>;

int n, m, q, seen[100001], dist[100001];
vector<int> adj[100001], freq[100001];
vector<pint> dp[100001];

int dfs(int i) {
    if (seen[i] == -q) return dist[i];
    dist[i] = seen[i] == q ? -n : 0;
    seen[i] = -q;
    for (int j: adj[i]) dist[i] = max(dist[i], dfs(j) + 1);
    return dist[i];
}

int main() {
    cin >> n >> m >> q;
    while (m--) {
        int s, e;
        cin >> s >> e;
        adj[e].emplace_back(s);
    }
    for (int i = 1; i <= n; ++i) {
        int mx = 0;
        for (int j: adj[i]) {
            for (auto [d, k]: dp[j]) {
                mx = max(mx, ++d);
                freq[d].clear();
                if (seen[k] == i) dist[k] = max(dist[k], d);
                else {
                    seen[k] = i;
                    dist[k] = d;
                }
            }
        }
        for (int j: adj[i]) {
            for (auto [d, k]: dp[j]) {
                if (not seen[k]) continue;
                freq[dist[k]].emplace_back(k);
                seen[k] = 0;
            }
        }
        for (freq[0] = {i}; ~mx; --mx) {
            for (int j: freq[mx]) {
                dp[i].emplace_back(mx, j);
                if (dp[i].size() * dp[i].size() >= n) goto end;
            }
        }
        end:;
    }
    for (; q; --q) {
        int t, y;
        cin >> t >> y;
        for (int i = y; i--;) {
            int c;
            cin >> c;
            seen[c] = q;
        }
        if (y < dp[t].size()) {
            for (auto [d, j]: dp[t]) {
                if (seen[j] == q) continue;
                cout << d << endl;
                break;
            }
        } else {
            int ans = dfs(t);
            cout << (ans < 0 ? -1 : ans) << endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...