제출 #1159503

#제출 시각아이디문제언어결과실행 시간메모리
1159503jotinhaBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2104 ms258964 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 const int maxn = 100005, sq = 318; int tot[maxn], vis[maxn]; vector<int> g[maxn]; vector<pair<int, vector<int>>> qr[maxn]; pair<int, int> dp[maxn][sq]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m, q; cin >> n >> m >> q; for(int i = 0; i < m; i++) { int u, v; cin >> u >> v; --u, --v; g[u].emplace_back(v); g[v].emplace_back(u); } 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 inf = 0x3f3f3f3f; for(int i = 0; i < n; i++) { for(int j = 0; j < sq; j++) { dp[i][j] = {-inf, -inf}; } } function<void(int)> dfs = [&](int u) { if(vis[u]) { return; } set<pair<int, int>> wait { {0, u} }; map<int, int> dis; for(int nxt : g[u]) { if(nxt < u) { dfs(nxt); for(int i = 0; i < sq && dp[nxt][i].first >= 0; i++) { if(!dis.count(dp[nxt][i].second)) { wait.emplace(dp[nxt][i].first + 1, dp[nxt][i].second); dis[dp[nxt][i].second] = dp[nxt][i].first + 1; } else if(dis[dp[nxt][i].second] < dp[nxt][i].first + 1) { wait.erase({dis[dp[nxt][i].second], dp[nxt][i].second}); dis[dp[nxt][i].second] = dp[nxt][i].first + 1; wait.emplace(dp[nxt][i].first + 1, dp[nxt][i].second); } if((int) wait.size() >= sq) { wait.erase(wait.begin()); } } } } int te = (int) wait.size(); for(int i = 0; i < te; i++) { auto [d, v] = *wait.rbegin(); dp[u][i] = {d, v}; wait.erase(--wait.end()); } vis[u] = 1; }; vector<int> ans(t, -1); for(int i = n - 1; i >= 0; i--) { if(tot[i] >= sq) { auto dist = bfs(i); multiset<int> ms(dist.begin(), dist.end()); ms.insert(-1); for(int j = 0; j < qr[i].size(); j++) { for(int nxt : qr[i][j].second) { ms.erase(ms.find(dist[nxt])); } ans[qr[i][j].first] = *ms.rbegin(); for(int nxt : qr[i][j].second) { ms.insert(dist[nxt]); } } } else { dfs(i); // cerr << i + 1 << '\n'; // for(int j = 0; j < 5; j++) { // cerr << dp[i][j].first << ' ' << dp[i][j].second + 1 << '\n'; // } // cerr << "------------\n"; for(int j = 0; j < sq; j++) { for(int k = 0; k < qr[i].size(); k++) { if(ans[qr[i][k].first] == -1) { 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...