제출 #1221426

#제출 시각아이디문제언어결과실행 시간메모리
1221426siewjhBitaro’s Party (JOI18_bitaro)C++20
100 / 100
1322 ms411128 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int inf = 1e9 + 7; vector<int> radj[MAXN]; vector<pair<int, int>> best[MAXN]; bool vis[MAXN], busy[MAXN]; int dist[MAXN]; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int nodes, edges, queries; cin >> nodes >> edges >> queries; int sz = sqrt(nodes); for (int i = 0; i < edges; i++){ int a, b; cin >> a >> b; radj[b].push_back(a); } for (int i = 1; i <= nodes; i++){ vector<int> visv; dist[i] = 0; vis[i] = 1; visv.push_back(i); for (int prv : radj[i]) for (auto p : best[prv]){ int d = p.first + 1, x = p.second; if (vis[x]){ if (d > dist[x]) dist[x] = d; } else { dist[x] = d; vis[x] = 1; visv.push_back(x); } } for (int x : visv) { best[i].push_back({dist[x], x}); vis[x] = 0; } sort(best[i].begin(), best[i].end(), greater<pair<int, int>>()); while (best[i].size() > sz) best[i].pop_back(); } for (int q = 0; q < queries; q++){ int x, bnum; cin >> x >> bnum; vector<int> bv(bnum); for (int i = 0; i < bnum; i++) { cin >> bv[i]; busy[bv[i]] = 1; } if (bnum < sz){ int ans = -1; for (auto p : best[x]) if (!busy[p.second]){ ans = p.first; break; } cout << ans << '\n'; } else{ vector<int> memo(x + 1, -1); for (int i = 1; i <= x; i++){ if (!busy[i]) memo[i] = 0; for (int prv : radj[i]) if (memo[prv] != -1) memo[i] = max(memo[i], memo[prv] + 1); } cout << memo[x] << '\n'; } for (int i = 0; i < bnum; i++) busy[bv[i]] = 0; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...