Submission #712193

#TimeUsernameProblemLanguageResultExecution timeMemory
712193noeditPastiri (COI20_pastiri)C++17
100 / 100
904 ms114288 KiB
#include <bits/stdc++.h>
//#include <quadmath.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#define sz(x) (int)x.size()
//#define sqr(x) x*x
#pragma GCC optimize("-O3")
#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx,avx2,tune=native")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("fast-math")
using namespace std;
using namespace __gnu_pbds;

//#define int long long
//#define ld long double
template <class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long ll;

const int INF = 2e9;

vector<vector<int> > g;

vector<int> dep;
vector<bool> used;
vector<vector<int> > up;
vector<bool> deld;
vector<int> dist;
vector<int> sh;

int l = 0;

void calc(int v, int p, int d)
{
    up[0][v] = p;
    for (int i = 1; i < l; i++)
    {
        up[i][v] = up[i - 1][up[i - 1][v]];
    }
    dep[v] = d;
    for (auto& u : g[v])
    {
        if (u != p)
        {
            calc(u, v, d + 1);
        }
    }
}

void del(int v, int p)
{
    deld[v] = 1;
    for (auto& u : g[v])
    {
        if (dist[u] < dist[v] && !deld[u] && u != p)
        {
            del(u, v);
        }
    }
}

void solve()
{
    int n, k;
    cin >> n >> k;
    used.resize(n);
    dist.resize(n, INF);
    dep.resize(n);
    g.resize(n);
    deld.resize(n);
    sh.resize(k);
    for (int i = 0; i < n - 1; i++)
    {
        int x, y;
        cin >> x >> y;
        x--; y--;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    while ((1 << l) <= n)
    {
        l++;
    }
    up.resize(l, vector<int>(n));
    queue<int> q;
    for (int i = 0; i < k; i++)
    {
        int x;
        cin >> x;
        x--;
        sh[i] = x;
        dist[x] = 0;
        used[x] = 1;
        q.push(x);
    }
    while (!q.empty())
    {
        int v = q.front();
        q.pop();
        for (auto& u : g[v])
        {
            if (dist[u] > dist[v] + 1)
            {
                dist[u] = dist[v] + 1;
                q.push(u);
            }
        }
    }
    calc(0, 0, 0);
    vector<int> ans;
    sort(sh.begin(), sh.end(), [&](int i, int j) {return dep[i] > dep[j];});
    for (int i = 0; i < k; i++)
    {
        if (deld[sh[i]]) continue;
        int a = sh[i];
        for (int j = l - 1; j >= 0; j--)
        {
            if (dist[up[j][a]] == dist[a] + (1 << j))
            {
                a = up[j][a];
            }
        }
        ans.push_back(a);
        del(a, a);
    }
    cout << ans.size() << endl;
    for (auto& x : ans)
        cout << x + 1 << ' ';
}


signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    t = 1;
    //cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}
/*
4 2 4
3 1 1 10
9 2 2 4
7 2 5 7;
4 1 8 10
5 3
5 6
5 9
1 10
*/

/*
4
1 3
2 4
2 3
3 4

*/

/*
1 1 1
100000000 1 1 1
1 1
*/

/*
????????????????????????????????????????????????
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...