Submission #559604

#TimeUsernameProblemLanguageResultExecution timeMemory
559604KaipaloBitaro’s Party (JOI18_bitaro)C++14
100 / 100
1963 ms415300 KiB
#include <iostream> #include <vector> #include <algorithm> #include <string.h> using namespace std; const int sqrt = 500; int n, m, q; vector <int> parent[100005]; struct st { int idx, d; bool operator < (const st &other) const { return d > other.d; } }; vector <int> canGo; vector <st> dist[100005], all; st visited[100005]; int busy[100005], dp[100005]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m >> q; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; parent[v].push_back(u); } for (int i = 1; i <= n; i++) { canGo.clear(); all.clear(); canGo.push_back(i); visited[i] = {i, 0}; for (auto p : parent[i]) { for (auto go : dist[p]) { if (visited[go.idx].idx != i) { visited[go.idx] = {i, 1 + go.d}; canGo.push_back(go.idx); } else { if (visited[go.idx].d < 1 + go.d) { visited[go.idx].d = 1 + go.d; } } } } for (auto go : canGo) { all.push_back({go, visited[go].d}); } sort(all.begin(), all.end()); for (int j = 0; j < min((int)all.size(), sqrt); j++) { dist[i].push_back(all[j]); } } for (int i = 1; i <= q; i++) { int t, y; cin >> t >> y; for (int j = 0; j < y; j++) { int x; cin >> x; busy[x] = i; } if (y < sqrt) { bool found = false; for (auto e : dist[t]) { if (busy[e.idx] != i) { cout << e.d << '\n'; found = true; break; } } if (!found) cout << -1 << '\n'; } else { memset(dp, -1, sizeof(dp)); for (int j = 1; j <= t; j++) { if (busy[j] != i) dp[j] = 0; for (auto p : parent[j]) { if (dp[p] == -1) continue; else dp[j] = max(dp[j], dp[p] + 1); } } cout << dp[t] << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...