Submission #1159520

#TimeUsernameProblemLanguageResultExecution timeMemory
1159520jotinhaBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2092 ms10612 KiB
/** * author: Jotinha (ツ) * created: 02-28-2025 11:09:44 **/ #include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "algo/debug.h" #else #define debug(...) 42 #endif struct Bit { int n; vector<int> bit; Bit(int _n=0) : n(_n), bit(n + 1) {} Bit(vector<int>& v) : n(v.size()), bit(n + 1) { for (int i = 1; i <= n; i++) { bit[i] += v[i - 1]; int j = i + (i & -i); if (j <= n) bit[j] += bit[i]; } } void update(int i, int x) { // soma x na posicao i for (i++; i <= n; i += i & -i) bit[i] += x; } int pref(int i) { // soma [0, i] int ret = 0; for (i++; i; i -= i & -i) ret += bit[i]; return ret; } int query(int l, int r) { // soma [l, r] return pref(r) - pref(l - 1); } int upper_bound(int x) { int p = 0; for (int i = __lg(n); i+1; i--) if (p + (1<<i) <= n and bit[p + (1<<i)] <= x) x -= bit[p += (1 << i)]; return p; } }; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m, q; cin >> n >> m >> q; vector<vector<int>> g(n); for(int i = 0; i < m; i++) { int u, v; cin >> u >> v; --u, --v; g[u].push_back(v); g[v].push_back(u); } vector<int> tot(n); vector<vector<pair<int, vector<int>>>> qr(n); int t = 0; for(int i = 0; i < q; i++) { int u, k; cin >> u >> k; --u; vector<int> v(k); for(int& j : v) { cin >> j; --j; } qr[u].emplace_back(make_pair(t++, v)); tot[u] += (int) v.size(); } auto bfs = [&](int u) { vector<int> dist(n, -1); queue<int> qe; qe.emplace(u); dist[u] = 0; while(!qe.empty()) { auto v = qe.front(); qe.pop(); for(int nxt : g[v]) { if(nxt < v && dist[nxt] < dist[v] + 1) { dist[nxt] = dist[v] + 1; qe.push(nxt); } } } return dist; }; const int sq = 400; const int inf = 0x3f3f3f3f; vector<vector<pair<int, int>>> dp(n, vector<pair<int, int>> (sq, make_pair(-inf, inf))); vector<int> vis(n); function<void(int)> dfs = [&](int u) { if(vis[u]) { return; } vector<pair<int, int>> wait { {0, u} }; for(int nxt : g[u]) { if(nxt < u) { dfs(nxt); for(int i = 0; i < sq && dp[nxt][i].first >= 0; i++) { wait.emplace_back(dp[nxt][i].first + 1, dp[nxt][i].second); } } } sort(wait.rbegin(), wait.rend()); wait.erase(unique(wait.begin(), wait.end()), wait.end()); for(int i = 0; i < sq && i < (int) wait.size(); i++) { dp[u][i] = wait[i]; } vis[u] = 1; }; vector<int> ans(t, -2); for(int i = n - 1; i >= 0; i--) { if(tot[i] >= sq) { auto dist = bfs(i); auto d2 = dist; sort(d2.rbegin(), d2.rend()); for(int j = 0; j < qr[i].size(); j++) { sort(qr[i][j].second.begin(), qr[i][j].second.end(), [&](int x, int y) { return dist[x] > dist[y]; }); int ge = 1; for(int k = 0; k < (int) qr[i][j].second.size(); k++) { if(dist[qr[i][j].second[k]] != d2[k]) { ans[qr[i][j].first] = d2[k]; ge = 0; break; } } if(ge) { if((int) qr[i][j].second.size() == n) { ans[qr[i][j].first] = -1; } else { ans[qr[i][j].first] = d2[(int) qr[i][j].second.size()]; } } } } else { dfs(i); for(int j = 0; j < sq; j++) { for(int k = 0; k < qr[i].size(); k++) { if(ans[qr[i][k].first] == -2) { int show = 1; for(int nxt : qr[i][k].second) { if(nxt == dp[i][j].second) { show = 0; break; } } if(show) { ans[qr[i][k].first] = dp[i][j].first; } } } } } } for(int x : ans) { cout << (x < 0 ? -1 : x) << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...