Submission #760434

#TimeUsernameProblemLanguageResultExecution timeMemory
760434tcmmichaelb139Bitaro’s Party (JOI18_bitaro)C++17
100 / 100
1149 ms432432 KiB
#include "bits/stdc++.h" using namespace std; const int MAXN = 100'000; const int K = 350; int n, m, q; vector<int> adj[MAXN]; vector<int> revAdj[MAXN]; vector<pair<int, int>> kvals[MAXN]; bool done[MAXN]; int dp[MAXN]; bool busy[MAXN]; void dfs(int v) { if (!size(kvals[v])) kvals[v].push_back({0, v}); for (auto u : revAdj[v]) { if (!size(kvals[u])) dfs(u); vector<pair<int, int>> nxt; auto itv = begin(kvals[v]); auto itu = begin(kvals[u]); while (itv != end(kvals[v]) && itu != end(kvals[u]) && size(nxt) < K) { if (done[itv->second]) { itv++; continue; } if (done[itu->second]) { itu++; continue; } if (itv->first > itu->first + 1) { done[itv->second] = true; nxt.push_back(*(itv++)); } else { done[itu->second] = true; nxt.push_back({itu->first + 1, itu->second}); itu++; } } while (itv != end(kvals[v]) && size(nxt) < K) { if (!done[itv->second]) { done[itv->second] = true; nxt.push_back(*itv); } itv++; } while (itu != end(kvals[u]) && size(nxt) < K) { if (!done[itu->second]) { done[itu->second] = true; nxt.push_back({itu->first + 1, itu->second}); } itu++; } for (auto i : nxt) done[i.second] = false; swap(kvals[v], nxt); } } void solve(int v) { done[v] = true; if (!busy[v]) dp[v] = 0; for (auto u : revAdj[v]) { if (!done[u]) solve(u); if (dp[u] == -1) continue; dp[v] = max(dp[v], dp[u] + 1); } } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> q; for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; a--, b--; adj[a].push_back(b); revAdj[b].push_back(a); } for (int i = 0; i < n; i++) { if (size(adj[i])) continue; dfs(i); } while (q--) { int t, y; cin >> t >> y; t--; vector<int> b(y); for (int i = 0; i < y; i++) { cin >> b[i]; b[i]--; busy[b[i]] = true; } int ans = -1; if (y < K) { for (auto i : kvals[t]) if (!busy[i.second]) { ans = i.first; break; } } else { for (int i = 0; i < n; i++) dp[i] = -1; memset(done, false, sizeof done); solve(t); ans = dp[t]; } cout << ans << '\n'; for (auto i : b) busy[i] = false; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...