제출 #670206

#제출 시각아이디문제언어결과실행 시간메모리
670206hafoBitaro’s Party (JOI18_bitaro)C++17
14 / 100
1780 ms270900 KiB
#include <bits/stdc++.h> #define ll long long #define ull unsigned ll #define pb push_back #define pa pair<int, int> #define pall pair<ll, int> #define fi first #define se second #define TASK "test" #define all(x) x.begin(), x.end() using namespace std; template<typename T1, typename T2> bool mini (T1 &a, T2 b) {if(a > b) a = b; else return 0; return 1;} template<typename T1, typename T2> bool maxi (T1 &a, T2 b) {if(a < b) a = b; else return 0; return 1;} const int MOD = 1e9 + 7; const int LOG = 20; const int maxn = 1e5 + 7; const ll oo = 1e15 + 69; const int sz = 320; int n, m, q, u, v, t, y, c, id[maxn], d[maxn]; bool vis[maxn]; pa f[sz][maxn], check[sz]; vector<int> g[maxn], topo, arc[maxn]; void dfs(int u) { vis[u] = 1; for(auto v:g[u]) if(!vis[v]) dfs(v); topo.pb(u); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); //freopen(TASK".inp", "r", stdin); //freopen(TASK".out", "w", stdout); cin>>n>>m>>q; while(m--) { cin>>u>>v; g[u].pb(v); arc[v].pb(u); } for(int i = 1; i <= n; i++) if(!vis[i]) dfs(i); reverse(all(topo)); for(int i = 1; i <= n; i++) for(int j = 0; j < sz; j++) f[j][i] = {0, (j == 0 ? i:-1)}; for(auto u:topo) { for(auto v:g[u]) { int j = 0; fill_n(check, sz, make_pair(-1, -1)); for(int i = 0; i < sz; i++) { if(i && check[i - 1].fi != -1) { check[i] = f[i][v]; f[i][v] = check[i - 1]; } while(j < sz && f[j][u].se != -1 && f[j][u].fi + 1 <= f[i][v].fi) j++; if(j < sz && f[j][u].se != -1 && f[j][u].fi + 1 > f[i][v].fi) { check[i] = f[i][v]; f[i][v] = {f[j][u].fi + 1, f[j][u].se}; j++; } } } } for(int k = 1; k <= q; k++) { cin>>t>>y; for(int i = 0; i < y; i++) { cin>>c; id[c] = k; } if(y >= sz) { fill_n(d, n + 1, -1); d[t] = 0; int ans = -1; if(id[t] != k) ans = 0; bool ok = 0; for(int i = topo.size() - 1; i >= 0; i--) { int u = topo[i]; if(d[u] == -1 || (u != t && !ok)) continue; if(u > t) continue; if(u == t) ok = 1; for(auto v:arc[u]) { maxi(d[v], d[u] + 1); if(v <= t && id[v] != k) maxi(ans, d[v]); } } cout<<ans<<"\n"; } else { int ans = -1; for(int i = 0; i < sz; i++) { int u = f[i][t].se; if(u == -1 || id[u] == k || u > t) continue; maxi(ans, f[i][t].fi); } cout<<ans<<"\n"; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...