Submission #1036768

#TimeUsernameProblemLanguageResultExecution timeMemory
1036768sinatbtfardRailway (BOI17_railway)C++17
100 / 100
90 ms24524 KiB
#include <bits/stdc++.h> #define pb push_back using namespace std; const int maxn = 1e5 + 1, maxLg = 20; int n, q, k, timer, a[maxn], h[maxn], st[maxn], fn[maxn], par[maxn][maxLg]; vector <pair <int, int>> adj[maxn], check; vector <int> res; void dfs (int v, int p = 0){ st[v] = timer++; par[v][0] = p; for (int i = 1; i < maxLg; i++) par[v][i] = par[par[v][i - 1]][i - 1]; for (auto [u, ind] : adj[v]){ if (u != p){ h[u] = h[v] + 1; dfs(u, v); } } fn[v] = timer++; } int lca (int x, int y){ if (h[x] < h[y]) swap(x, y); if (st[x] <= st[y] && fn[x] >= fn[y]) return x; for (int i = maxLg - 1; i >= 0; i--){ if (par[x][i] == 0) continue; int u = par[x][i]; if (!(st[u] <= st[y] && fn[u] >= fn[y])) x = u; } return par[x][0]; } void dfs2 (int v, int ind, int p = 0){ for (auto [u, i] : adj[v]) if (u != p) dfs2(u, i, v); a[p] += a[v]; if (a[v] >= 2 * k && ind > -1) res.pb(ind); } int main (){ ios_base::sync_with_stdio(0); cin >> n >> q >> k; for (int x, y, i = 0; i < n - 1; i++) cin >> x >> y, adj[x].pb({y, i}), adj[y].pb({x, i}); dfs(1); for (int s, i = 0; i < q; i++){ cin >> s; for (int x, j = 0; j < s; j++) cin >> x, check.pb({st[x], x}); sort(check.begin(), check.end()); for (int j = 0; j < s; j++){ auto [v, u] = make_pair(check[j].second, check[(j + 1) % s].second); a[v]++; a[u]++; a[lca(v, u)] -= 2; } check.clear(); } dfs2(1, -1); sort(res.begin(), res.end()); cout << res.size() << '\n'; for (auto e : res) cout << e + 1 << " "; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...