제출 #1277581

#제출 시각아이디문제언어결과실행 시간메모리
1277581hiepsimauhongBitaro’s Party (JOI18_bitaro)C++20
14 / 100
368 ms267568 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(I, L, R) for(int I(L) ; I <= (int)R ; ++I) #define FOD(I, R, L) for(int I(R) ; I >= (int)L ; --I) #define FOA(I, A) for(auto &I : A) #define print(A,L,R) FOR(OK, L, R){if(A[OK]<=-oo / 10||A[OK]>=oo)cout<<"- ";else cout<<A[OK]<<' ';}cout<<'\n'; #define prints(A) FOA(OK, A){cout<<OK<<' ';}cout << '\n'; #define printz(A,L,R) FOR(OK, 1, L){FOR(KO, 1, R){if(A[OK][KO]>-oo&&A[OK][KO]<oo)cout<<A[OK][KO]<<' ';else cout << "- ";} cout << '\n';}cout << '\n'; #define fs first #define sd second #define ii pair<int,int> #define iii pair<int, ii> #define all(A) A.begin(), A.end() #define quickly cin.tie(0) -> ios_base::sync_with_stdio(0); const int N = 2e5 + 5; const int SQRT = 320; const int oo = 1e9; int n, m, q; bool dead[N], vis[N]; int f[N], cnt[N]; ii dp[N][SQRT + 5], _new[N]; vector<int> g[N]; vector<int> go[N]; void MergeSort(int u, int v){ int i = 1, j = 1; int k = 0; while(i <= cnt[u] && j <= cnt[v]){ ii x = dp[u][i]; ii y = ii(dp[v][j].fs + 1, dp[v][j].sd); if(x.sd == y.sd){ _new[++k] = max(x, y); ++i; ++j; } else{ if(x.fs == y.fs){ _new[++k] = x; _new[++k] = y; ++i; ++j; } else if(x.fs < y.fs){ _new[++k] = y; ++j; } else{ _new[++k] = x; ++i; } } } while(i <= cnt[u]){ _new[++k] = dp[u][i]; ++i; } while(j <= cnt[v]){ _new[++k] = ii(dp[v][j].fs + 1, dp[v][j].sd); ++j; } cnt[u] = min(k, SQRT); FOR(i, 1, cnt[u]){ dp[u][i] = _new[i]; } } signed main(){ quickly cin >> n >> m >> q; FOR(i, 1, m){ int u, v; cin >> u >> v; g[v].push_back(u); go[u].push_back(v); } FOR(u, 1, n){ dp[u][++cnt[u]] = {0, u}; FOA(v, g[u]){ MergeSort(u, v); } } while(q--){ int t, s; cin >> t >> s; if(s >= SQRT){ memset(dead, 0, sizeof dead); memset(f, -1, sizeof f); FOR(i, 1, s){ int u; cin >> u; dead[u] = 1; } f[t] = 0; int ans = -1; FOD(u, t, 1){ FOA(v, go[u]){ if(f[v] != -1){ f[u] = max(f[u], f[v] + 1); } } if(!dead[u]){ ans = max(ans, f[u]); } } cout << ans << '\n'; } else{ vector<int> save; FOR(i, 1, s){ int u; cin >> u; save.push_back(u); vis[u] = 1; } vis[0] = 1; int ans = -1; FOR(i, 1, SQRT){ if(!vis[dp[t][i].sd]){ ans = dp[t][i].fs; break; } } FOR(i, 0, s - 1){ vis[save[i]] = 0; } cout << ans << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...