Submission #714025

#TimeUsernameProblemLanguageResultExecution timeMemory
714025vovamrPastiri (COI20_pastiri)C++17
100 / 100
808 ms101964 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define fi first #define se second #define ll long long #define ld long double #define sz(x) ((int)(x).size()) #define all(x) (x).begin(), (x).end() #define pb push_back #define mpp make_pair #define ve vector using namespace std; using namespace __gnu_pbds; template<class T> using oset = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>; const ll inf = 1e18; const int iinf = 1e9; typedef pair<ll, ll> pll; typedef pair<int, int> pii; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); template <typename T> inline bool chmin(T& a, T b) { return (a > b ? a = b, 1 : 0); } template <typename T> inline bool chmax(T& a, T b) { return (a < b ? a = b, 1 : 0); } const int N = 5e5 + 100; const int lg = 19; ve<int> gr[N]; int d[N]; int up[N][lg]; inline void dfs(int v, int p) { up[v][0] = p; for (int i = 1; i < lg; ++i) up[v][i] = up[up[v][i - 1]][i - 1]; for (const auto &to : gr[v]) { if (to == p) continue; d[to] = d[v] + 1; dfs(to, v); } } inline void solve() { int n, k; cin >> n >> k; for (int i = 1; i < n; ++i) { int v, u; cin >> v >> u, --v, --u; gr[v].pb(u), gr[u].pb(v); } dfs(0, 0); ve<pii> a(k); for (auto &[x, y] : a) { cin >> y; x = d[--y]; } sort(all(a)); reverse(all(a)); ve<int> dist(n, -1); queue<int> q; for (const auto &[x, y] : a) { dist[y] = 0; q.push(y); } while (sz(q)) { int v = q.front(); q.pop(); for (const auto &to : gr[v]) { if (~dist[to]) continue; dist[to] = dist[v] + 1; q.push(to); } } ve<int> answer, used(n); function<void(int)> upd = [&](int v) { used[v] = 1; for (const auto &to : gr[v]) { if (used[to]) continue; if (dist[to] != dist[v] - 1) continue; upd(to); } }; for (const auto &[x, y] : a) { if (used[y]) continue; int v = y; for (int i = lg - 1; ~i; --i) { if (dist[up[v][i]] == d[y] - d[up[v][i]]) { v = up[v][i]; } } answer.pb(v + 1); upd(v); } cout << sz(answer) << '\n'; for (const auto &x : answer) cout << x << " "; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int q = 1; // cin >> q; while (q--) solve(); cerr << fixed << setprecision(3) << "Time execution: " << (double)clock() / CLOCKS_PER_SEC << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...