Submission #791346

#TimeUsernameProblemLanguageResultExecution timeMemory
791346ilia_rrBitaro’s Party (JOI18_bitaro)C++17
100 / 100
753 ms293336 KiB
// بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيمِ // Written by Ilia Rahbar // #pragma GCC optimize ("O3,no-stack-protector,unroll-loops,fast-math") // #pragma GCC target ("abm,bmi,bmi2,tbm,avx2") #include <bits/stdc++.h> using namespace std; #define int int64_t #define sz(x) int(x.size()) #define ai(x) array <int, x> #define be(x) x.begin(), x.end() #define pb push_back #define el '\n' #define sp ' ' #define fi first #define se second const int M = 1e9 + 7, N = 1e6 + 100; int n, m, q, u, ans, v, vs[N], t, sq = 100, dp[N]; bool av[N]; vector <int> g[N], in; vector <ai(2)> f[N], uni; void mrg(vector <ai(2)> &a, vector <ai(2)> &b) { uni.clear(); for (int p1 = 0, p2 = 0; p1 < sz(a) || p2 < sz(b); ) { if (p1 < sz(a)) { if (p2 < sz(b)) { if (a[p1][0] > b[p2][0]) uni.pb(a[p1++]); else uni.pb(b[p2++]); } else uni.pb(a[p1++]); } else uni.pb(b[p2++]); } b.clear(); for (auto [x, y] : uni) if (!vs[y]) vs[y] = 1, b.pb({x, y}); for (auto [x, y] : uni) vs[y] = 0; if (sz(b) > sq) b.resize(sq); } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> q; while (m--) cin >> u >> v, g[u].pb(v); for (int i = 1; i <= n; i++) f[i].pb({0, i}); for (int i = 1; i <= n; i++) { for (int j = 0; j < sz(f[i]); j++) f[i][j][0]++; for (auto j : g[i]) mrg(f[i], f[j]); for (int j = 0; j < sz(f[i]); j++) f[i][j][0]--; } while (q--) { cin >> u >> t; in.clear(); ans = -1; for (int i = 0; i < t; i++) cin >> v, in.pb(v), av[v] = 1; for (auto [x, y] : f[u]) if (!av[y]) { ans = x; break; } if (t >= sq && ans == -1) { fill(dp, dp + u + 1, -M); for (int i = 1; i <= u; i++) { if (!av[i]) dp[i] = max(dp[i], int(0)); for (auto j : g[i]) dp[j] = max(dp[j], dp[i] + 1); } ans = dp[u]; } cout << (ans < 0 ? -1 : ans) << el; for (auto i : in) av[i] = 0; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...