제출 #1265760

#제출 시각아이디문제언어결과실행 시간메모리
1265760canhnam357Bitaro’s Party (JOI18_bitaro)C++20
100 / 100
1661 ms376600 KiB
#include <bits/stdc++.h> using namespace std; #define N 100'001 int dp[N], mark[N]{}; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m, q; cin >> n >> m >> q; vector<pair<int, int>> e(m); vector<vector<int>> adj(n + 1); for (auto &[u, v] : e) cin >> v >> u, adj[u].push_back(v); sort(e.rbegin(), e.rend()); const int B = 150; vector<vector<pair<int, int>>> p(n + 1); int timer = 0; for (int i = 1; i <= n; i++) { timer++; p[i].emplace_back(0, i); for (int v : adj[i]) { for (auto [d, id] : p[v]) { p[i].emplace_back(d + 1, id); } } sort(p[i].rbegin(), p[i].rend()); int l = 0; for (int r = 0; r < p[i].size() && l < B; r++) { if (mark[p[i][r].second] != timer) { p[i][l++] = p[i][r]; mark[p[i][r].second] = timer; } } while (p[i].size() > l) p[i].pop_back(); } while (q--) { timer++; int t; cin >> t; int k; cin >> k; vector<int> c(k); for (int &i : c) cin >> i; while (k > 0 && c[k - 1] > t) { c.pop_back(); k--; } for (int i : c) mark[i] = timer; if (k >= B) { memset(dp, -1, sizeof dp); dp[t] = 0; for (auto [u, v] : e) { if (dp[u] >= 0) { dp[v] = max(dp[v], dp[u] + 1); } } int ans = -1, j = 0; for (int i = 1; i <= n; i++) { if (j < k && c[j] == i) j++; else if (dp[i] >= 0) { ans = max(ans, dp[i]); } } cout << ans << '\n'; } else { int ans = -1; for (auto [d, id] : p[t]) { if (mark[id] != timer) { ans = d; break; } } cout << ans << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...