제출 #1160159

#제출 시각아이디문제언어결과실행 시간메모리
1160159jotinhaBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2103 ms268540 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 vector<pair<int, vector<int>>> qr[100005]; pair<int, int> dp[100005][318]; void countingSort(vector<int>& arr, int mn = 0, int mx = 100000){ int i,k=0,sizeTemp = mx-mn+1; int temp[sizeTemp]; // Initializing all element of counting array with 0 for(i=0; i<sizeTemp; i++){ temp[i] = 0; } //Store the frequency of each element of the original array //at the relative position in counting array for(i=0; i< (int) arr.size(); i++){ temp[arr[i]-mn]++; } //Iterate through the counting array and re-write the original array. for (i=mx; i>=mn; i--){ while(temp[i-mn]-->0){ arr[k++]=i; } } } 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; if(u < v) { swap(u, v); } g[u].push_back(v); } vector<int> tot(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(dist[nxt] < dist[v] + 1) { dist[nxt] = dist[v] + 1; qe.push(nxt); } } } return dist; }; const int sq = 318; const int inf = 0x3f3f3f3f; for(int i = 0; i < n; i++) { for(int j = 0; j < sq; j++) { dp[i][j] = {-inf, -inf}; } } vector<int> h(n); auto merge = [&](pair<int, int>* a, pair<int, int>* b) { pair<int, int> c[sq]; int at = 0; int l = 0, r = 0; while(at < sq && l < sq && r < sq) { auto [d1, v1] = a[l]; auto [d2, v2] = b[r]; d2++; if(v1 < 0 or h[v1]) { d1 = -1; l++; } if(v2 < 0 or h[v2]) { d2 = -1; r++; } if(v1 >= 0 && d1 > d2) { l++; h[v1] = 1; c[at++] = {d1, v1}; } else if(v2 >= 0 && !h[v2]){ r++; h[v2] = 1; c[at++] = {d2, v2}; } } while(at < sq && l < sq) { if(a[l].second < 0 or h[a[l].second]) { l++; continue; } c[at++] = a[l++]; } while(at < sq && r < sq) { if(b[r].second < 0 or h[b[r].second]) { r++; continue; } c[at++] = b[r++]; } l = 0; while(l < sq) { if(a[l].second >= 0) { h[a[l].second] = 0; } if(b[l].second >= 0) { h[b[l].second] = 0; } l++; } for(int i = 0; i < sq; i++) { a[i] = c[i]; } }; vector<int> vis(n); function<void(int)> dfs = [&](int u) { if(vis[u]) { return; } dp[u][0] = {0, u}; for(int nxt : g[u]) { dfs(nxt); merge(dp[u], dp[nxt]); } 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; for(int j = 0; j < n; j++) { d2[j] += 1; } countingSort(d2); 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] - 1) { ans[qr[i][j].first] = d2[k] - 1; 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()] - 1; } } } } 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...