Submission #877272

#TimeUsernameProblemLanguageResultExecution timeMemory
877272socpitePastiri (COI20_pastiri)C++14
100 / 100
482 ms74784 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 5e5 + 5; int d[maxn]; int n, k; vector<int> g[maxn]; int mark[maxn]; int dep[maxn]; int par[maxn]; int used[maxn]; int X[maxn]; bool cmp(int a, int b) { return dep[a] > dep[b]; } void dfs(int x, int p) { dep[x] = dep[p] + 1; par[x] = p; for (auto v : g[x]) { if (v == p) continue; dfs(v, x); } } void bfs() { queue<int> q; for (int i = 1; i <= n; i++) { d[i] = -1; } for (int i = 0; i < k; i++) { d[X[i]] = 0; q.push(X[i]); } while (!q.empty()) { auto x = q.front(); // cout << x << " " << d[x] << endl; q.pop(); for (auto v : g[x]) { if (d[v] != -1) continue; d[v] = d[x] + 1; q.push(v); } } } void clear(int x) { mark[x] = 1; for (auto v : g[x]) { if (mark[v] || d[v] != d[x] - 1) continue; clear(v); } } vector<int> ans; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> k; for (int i = 0; i < n - 1; i++) { int a, b; cin >> a >> b; g[a].push_back(b); g[b].push_back(a); } for (int i = 0; i < k; i++) cin >> X[i]; dfs(1, 0); bfs(); sort(X, X + k, cmp); for (int i = 0; i < k; i++) { if (mark[X[i]]) continue; int crr = X[i]; while (par[crr] && d[par[crr]] == d[crr]+1) crr = par[crr]; ans.push_back(crr); clear(crr); } cout << ans.size() << "\n"; for (auto v : ans) cout << v << " "; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...