Submission #916794

#TimeUsernameProblemLanguageResultExecution timeMemory
916794upedRailway (BOI17_railway)C++14
100 / 100
252 ms40652 KiB
#include <bits/stdc++.h> #define DEBUG(x) cout << #x << ": " << x << '\n'; using namespace std; const int MAXN = 1e5 + 1; const int LOGN = 20; int depth[MAXN]; int euler[MAXN]; int jmp[LOGN][MAXN]; int starting[MAXN]; int ending[MAXN]; vector<int> adj[MAXN]; int timer = 0; void init_lca(int n, int p = 0) { depth[n] =depth[p] + 1; jmp[0][n] = p; euler[n] = timer++; for (int x : adj[n]) { if (x == p) continue; init_lca(x, n); } } void init_lca() { init_lca(1); for (int i = 1; i < LOGN; ++i) { for (int j = 1; j < MAXN; ++j) { jmp[i][j] = jmp[i - 1][jmp[i - 1][j]]; } } } int lca(int a, int b) { if (depth[a] < depth[b]) swap(a, b); for (int i = 0; i < LOGN; ++i) { if ((depth[a] - depth[b]) & (1 << i)) a = jmp[i][a]; } if (a == b) return a; for (int i = LOGN - 1; i >= 0; --i) { int la = jmp[i][a]; int lb = jmp[i][b]; if (la != lb) { a = la; b = lb; } } return jmp[0][a]; } map<pair<int, int>, int> edge_to_idx; int ans[MAXN]; int solve(int n, int p = -1) { int k = starting[n]; for (int x : adj[n]) { if (x == p) continue; k += solve(x, n); } k -= ending[n]; ans[edge_to_idx[{n, p}]] = k; return k; } int main() { int n, m, k; cin >> n >> m >> k; for (int i = 1; i < n; ++i) { int a, b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); edge_to_idx[{a, b}] = i; edge_to_idx[{b, a}] = i; } init_lca(); for (int i = 0; i < m; ++i) { int s; cin >> s; vector<int> v(s); for (int i = 0; i < s; ++i) { cin >> v[i]; } sort(v.begin(), v.end(), [&](int a, int b) { return euler[a] < euler[b]; }); int root = v[0]; for (int i = 1; i < s; ++i) { root = lca(root, v[i]); } int last = root; for (int i = 0; i < s; ++i) { ending[lca(last, v[i])]++; starting[v[i]]++; last = v[i]; } } solve(1); vector<int> v; for (int i = 1; i < n; ++i) { if (ans[i] >= k) v.push_back(i); } cout << v.size() << '\n'; for (int x : v) { cout << x << ' '; } }
#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...