Submission #1277566

#TimeUsernameProblemLanguageResultExecution timeMemory
1277566hiepsimauhongBitaro’s Party (JOI18_bitaro)C++20
14 / 100
384 ms261808 KiB
#include <bits/stdc++.h> using namespace std; //#define int long long #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[2 * SQRT]; vector<int> g[N]; bool compare(ii u, ii v){ if(u.fs > v.fs){ return 1; } if(u.fs == v.fs){ return u.sd != v.sd; } return 0; } void MergeSort(int u, int v){ int j = 1; int k = 0; FOR(i, 1, cnt[u]){ while(j <= cnt[v] && compare(ii(dp[v][j].fs + 1, dp[v][j].sd), dp[u][i])){ _new[++k] = ii(dp[v][j].fs + 1, dp[v][j].sd); ++j; } while(j <= cnt[v] && ii(dp[v][j].fs + 1, dp[v][j].sd) == dp[u][i]){ ++j; } _new[++k] = dp[u][i]; } while(j <= cnt[v]){ _new[++k] = dp[v][j]; ++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); } 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){ bool is = 0; memset(dead, 0, sizeof dead); memset(f, 0, sizeof f); FOR(i, 1, s){ int u; cin >> u; dead[u] = 1; if(u == t) is = 1; } FOR(u, 1, t){ FOA(v, g[u]){ if(!dead[v]){ f[u] = max(f[v] + 1, f[u]); } else{ if(f[v] != 0){ f[u] = max(f[u], f[v] + 1); } } } } if(f[t] == 0 && is == 1){ cout << -1 << '\n'; continue; } cout << f[t] << '\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...