Submission #877645

#TimeUsernameProblemLanguageResultExecution timeMemory
877645huutuanPastiri (COI20_pastiri)C++14
8 / 100
628 ms118744 KiB
#include<bits/stdc++.h> #define taskname "sheep" using namespace std; const int N=5e5+1; int n, k, a[N], dep[N], par[N], dist[N], del[N], vis[N]; set<int> g[N]; void bfs(){ memset(dist, -1, sizeof dist); queue<int> q; for (int i=1; i<=n; ++i) if (a[i]) q.push(i), dist[i]=0; while (q.size()){ int u=q.front(); q.pop(); for (int v:g[u]) if (dist[v]==-1){ dist[v]=dist[u]+1; q.push(v); } } } void dfs(int u, int p){ par[u]=p; for (int v:g[u]) if (v!=p){ dep[v]=dep[u]+1; dfs(v, u); } } void bfs(int root){ queue<int> q; vector<int> vv; q.push(root); vis[root]=0; vv.push_back(root); while (q.size()){ int u=q.front(); q.pop(); if (vis[u]==dist[root]) continue; for (int v:g[u]) if (vis[v]==-1){ vis[v]=vis[u]+1; q.push(v); vv.push_back(v); } } for (int i:vv){ del[i]=1; if (dep[i]>dep[root]){ for (int j:g[i]) g[j].erase(i); g[i].clear(); } vis[i]=-1; } } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); // freopen(taskname".inp", "r", stdin); // freopen(taskname".out", "w", stdout); cin >> n >> k; for (int i=1; i<n; ++i){ int u, v; cin >> u >> v; g[u].insert(v); g[v].insert(u); } for (int i=1; i<=k; ++i){ int x; cin >> x; a[x]=1; } bfs(); dfs(1, 0); memset(vis, -1, sizeof vis); vector<int> vv; for (int i=1; i<=n; ++i) if (a[i]) vv.push_back(i); sort(vv.begin(), vv.end(), [&](int x, int y){ return dep[x]<dep[y]; }); vector<int> ans; while (vv.size()){ int u=vv.back(); vv.pop_back(); int v=u; while (dist[par[v]]==dep[u]-dep[par[v]]) v=par[v]; ans.push_back(v); bfs(v); while (vv.size() && del[vv.back()]) vv.pop_back(); } cout << ans.size() << '\n'; for (int i:ans) cout << i << ' '; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...