Submission #988452

#TimeUsernameProblemLanguageResultExecution timeMemory
988452ortsacBitaro’s Party (JOI18_bitaro)C++14
100 / 100
1568 ms263284 KiB
#include <bits/stdc++.h> using namespace std; int block = 316; #define pii pair<int, int> #define fr first #define se second vector<vector<pii>> far; vector<bool> freq; pii aux[500]; void merge(int from, int to) { vector<pii> leaving; for (auto u : far[from]) { leaving.push_back({u.fr + 1, u.se}); } for (auto u : leaving) { freq[u.se] = 0; } for (auto u : far[to]) { freq[u.se] = 0; } int p1 = 0, p2 = 0; int n = leaving.size(); int m = far[to].size(); int s = 0; while ((s < block) && ((p1 < n) || (p2 < m))) { if (p1 == n) { // check p2 if (freq[far[to][p2].se]) { p2++; continue; } aux[s] = far[to][p2]; freq[far[to][p2].se] = 1; p2++; } else if (p2 == m) { // check p1 if (freq[leaving[p1].se]) { p1++; continue; } aux[s] = leaving[p1]; freq[leaving[p1].se] = 1; p1++; } else { if (freq[leaving[p1].se]) { p1++; continue; } if (freq[far[to][p2].se]) { p2++; continue; } if (leaving[p1] > far[to][p2]) { aux[s] = leaving[p1]; freq[leaving[p1].se] = 1; p1++; } else { aux[s] = far[to][p2]; freq[far[to][p2].se] = 1; p2++; } } s++; } far[to].resize(s); for (int i = 0; i < s; i++) { far[to][i] = aux[i]; } } int main() { int n, m, q; cin >> n >> m >> q; vector<vector<int>> adj(n + 1); for (int i = 1; i <= m; i++) { int a, b; cin >> a >> b; adj[a].push_back(b); } far.resize(n + 1); freq.resize(n + 1); for (int i = 1; i <= n; i++) { far[i].push_back({0, i}); } for (int i = 1; i <= n; i++) { for (auto u : adj[i]) { merge(i, u); } } while (q--) { int t, y; cin >> t >> y; if (y >= block) { vector<int> mx(n + 1); while (y--) { int a; cin >> a; mx[a] = -1; } for (int i = 1; i <= t; i++) { if (mx[i] == -1) continue; for (auto u : adj[i]) { mx[u] = max(mx[u], mx[i] + 1); } } cout << mx[t] << "\n"; } else { unordered_map<int, bool> map; while (y--) { int a; cin >> a; map[a] = 1; } bool good = 0; for (auto u : far[t]) { if (!map[u.se]) { cout << u.fr << "\n"; good = 1; break; } } if (!good) { cout << "-1\n"; } } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...