Submission #1096162

#TimeUsernameProblemLanguageResultExecution timeMemory
1096162LinhLewLewPastiri (COI20_pastiri)C++17
100 / 100
524 ms123996 KiB
// PhuThuyRuntime <3 // A secret makes a woman woman #include <bits/stdc++.h> using namespace std; #define eb emplace_back #define ef emplace_front #define pb push_back #define pf push_front #define all(v) v.begin(), v.end() #define ins insert #define lb lower_bound #define ub upper_bound #define fo(i, l, r) for(int i = l; i <= r; i++) #define foi(i, l, r) for(int i = l; i >= r; i--) #define elif else if #define el cout << "\n"; #define pii pair<int, int> #define pli pair<ll, int> #define pll pair<ll, ll> #define pil pair<int, ll> #define fi first #define se second #define in(x) freopen(x, "r", stdin) #define out(x) freopen(x, "w", stdout) #define ll long long #define ull unsigned long long #define pob pop_back #define bs binary_search #define vi vector<int> #define vii vector<pair<int, int>> #define getbit(i, j) ((i >> j) & 1) #define offbit(i, j) ((1 << j) ^ i) #define onbit(i, j) ((1 << j) | i) const int N = 1e5 + 2; const ll mod = 1e9 + 7; const int inf = INT_MAX; const int base = 31; const long double EPS = 1e-9; const long double pi = acos(-1.0); int n, k, c[5 * N]; vi adj[5 * N]; void inp(){ cin >> n >> k; fo(i, 1, n - 1){ int u, v; cin >> u >> v; adj[u].eb(v); adj[v].eb(u); } fo(i, 1, k) cin >> c[i]; } bool visited[5 * N]; int dis[5 * N]; void bfs() { queue<int> Q; fo(i, 1, k){ visited[c[i]] = true; Q.push(c[i]); } while (Q.size() > 0) { int u = Q.front(); Q.pop(); for (auto v: adj[u]) { if (visited[v]) continue; visited[v] = true; dis[v] = dis[u] + 1; Q.push(v); } } } int dep[5 * N], up[5 * N][20]; void dfs(int u, int fa){ for(auto v : adj[u]){ if(v == fa) continue; dep[v] = dep[u] + 1; dfs(v, u); up[v][0] = u; } } bool cmp(int a, int b){ return dep[a] > dep[b]; } bool done[5 * N]; void mark(int u){ done[u] = 1; for(auto v : adj[u]){ if(done[v]) continue; if(dis[v] + 1 != dis[u]) continue; mark(v); } } void sol(){ dfs(1, 0); bfs(); fo(j, 1, 19){ fo(i, 1, n) up[i][j] = up[up[i][j - 1]][j - 1]; } sort(c + 1, c + k + 1, cmp); vi ans; fo(i, 1, k){ int u = c[i]; if(done[u]) continue; int x = u; foi(j, 19, 0){ int v = up[x][j]; if(v != 0 && dep[u] - dep[v] == dis[v]) x = v; } mark(x); ans.eb(x); } sort(ans.begin(), ans.end()); cout << ans.size() << '\n'; for (auto v: ans) if(v == ans.back()) cout << v; else cout << v << ' '; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); inp(); sol(); 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...