Submission #410625

#TimeUsernameProblemLanguageResultExecution timeMemory
410625NamnamseoBitaro’s Party (JOI18_bitaro)C++17
100 / 100
1420 ms411308 KiB
#include <iostream> #include <vector> #include <set> #include <queue> #include <utility> #include <algorithm> using namespace std; using pp=pair<int, int>; const int maxn = int(1e5) + 10; const int B = 300; int n, m, q; vector<int> re[maxn]; vector<pp> prec[maxn]; int seen[maxn]; int nt; int main() { cin.tie(0)->sync_with_stdio(0); cin >> n >> m >> q; for (int i=1; i<=m; ++i) { int s, e; cin >> s >> e; re[e].push_back(s); } for (int i=1; i<=n; ++i) { prec[i].reserve(B); prec[i].push_back({0, i}); for (int j:re[i]) { vector<pp> tmp, &v1 = prec[i], &v2 = prec[j]; int i1 = 0, i2 = 0; int s1 = int(v1.size()), s2 = int(v2.size()); ++nt; while (int(tmp.size()) < B && (i1 < s1 || i2 < s2)) { if (i1 < s1 && (i2 == s2 || v1[i1].first >= v2[i2].first+1)) { if (seen[v1[i1].second] != nt) { tmp.push_back(v1[i1]); } ++i1; } else { if (seen[v2[i2].second] != nt) { tmp.push_back(v2[i2]); ++tmp.back().first; } ++i2; } seen[tmp.back().second] = nt; } swap(v1, tmp); } } for (;q--;) { int dest, igs; cin >> dest >> igs; static int ign[maxn]; ++nt; for (int i=0; i<igs; ++i) { cin >> ign[i]; seen[ign[i]] = nt; } if (igs < B) { bool found = 0; for (auto [dist, from]:prec[dest]) { if (seen[from] != nt) { cout << dist << '\n'; found = 1; break; } } if (!found) { cout << "-1\n"; } continue; } static int qd[maxn]; fill(qd+1, qd+dest+1, -1); int ans = -1; qd[dest] = 0; for (int i=dest; 1<=i; --i) if (qd[i] != -1) { if (seen[i] != nt) { ans = max(ans, qd[i]); } for (int j:re[i]) { qd[j] = max(qd[j], qd[i]+1); } } cout << ans << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...