제출 #1030124

#제출 시각아이디문제언어결과실행 시간메모리
1030124SamuellH12Bitaro’s Party (JOI18_bitaro)C++17
14 / 100
2076 ms484044 KiB
#include <bits/stdc++.h> #define optimize ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL) #define ALL(x) x.begin(), x.end() #define endl "\n" #define ll long long #define vi vector<int> #define pii pair<int,int> #define INF 0x3f3f3f3f const int MAXN = 1e5 + 5; const int SQRT = 100; using namespace std; int block[MAXN], tempo = 0; vi trafo[MAXN]; set<pii> best[MAXN]; vi order; int deg[MAXN]; void get_order(int n){ queue<int> fila; for(int i=1; i<=n; i++) if(deg[i] == 0) fila.emplace(i); while(!fila.empty()) { auto u = fila.front(); fila.pop(); order.emplace_back(u); for(auto v : trafo[u]) if(--deg[v] == 0) fila.emplace(v); } reverse(ALL(order)); } void precalc(){ for(auto u : order) { for(auto v : trafo[u]) { best[u].emplace(-1, v); for(auto [x, w] : best[v]) { best[u].emplace(x-1, w); if(best[u].size() > SQRT) best[u].erase(--best[u].end()); } } while(best[u].size() > SQRT) best[u].erase(--best[u].end()); } } int dp[MAXN]; int solve(int w){ for(auto u : order) { dp[u] = (block[u] == tempo ? -1 : 0); for(auto v : trafo[u]) if(~dp[v]) dp[u] = max(dp[u], dp[v]+1); if(u == w) break; } return dp[w]; } int main(){ optimize; int n, m, q; cin >> n >> m >> q; for(int i=0, u, v; i<m; i++) { cin >> u >> v; trafo[v].emplace_back(u); deg[u]++; } get_order(n); precalc(); int t, y; while(q--) { tempo++; cin >> t >> y; for(int i=0, x; i<y; i++) cin >> x, block[x] = tempo; int ans = -1; for(auto [x, w] : best[t]) if(block[w] != tempo) { ans = -x; break; } if(ans == -1) ans = solve(t); cout << ans << endl; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...