Submission #381562

#TimeUsernameProblemLanguageResultExecution timeMemory
381562VimmerPastiri (COI20_pastiri)C++14
8 / 100
368 ms34944 KiB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

//#pragma GCC optimize("-O3")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-Ofast")

#define N 500050
#define NN 1005000
#define PB push_back
#define endl '\n'
#define pri(x) cout << x << endl
#define _ << " " <<
#define all(x) x.begin(), x.end()
#define sz(x) int(x.size())
#define M ll(1e9 + 7)
#define F first
#define S second

using namespace std;
//using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef short int si;
typedef unsigned long long ull;

//typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

//ordered_set se;

int n, k;

bool mk[N];

vector <int> g[N];

void solve_1()
{
    vector <int> vr; vr.clear();

    vector <int> ans; ans.clear();

    int x;

    for (int i = 1; i <= n; i++)
        if (sz(g[i]) == 1)
            x = i;

    vector <int> pr; pr.clear();

    while (1)
    {
        int nxt = -1;

        for (auto it : g[x])
        {
            if (sz(vr) && it == vr.back()) continue;

            nxt = it;
        }

        if (mk[x])
            pr.PB(sz(vr));

        vr.PB(x);

        x = nxt;

        if (x == -1)
            break;
    }

    for (int i = 0; i < sz(pr); i++)
    {
        int nm = pr[i];

        if (i + 1 == sz(pr))
        {
            ans.PB(vr[nm]);

            continue;
        }

        int len = pr[i + 1] - nm;

        if (len & 1)
        {
            ans.PB(vr[nm]);

            continue;
        }
        else
        {
            len /= 2;

            ans.PB(vr[nm + len]);

            i++;

            continue;
        }
    }

    pri(sz(ans));

    for (auto it : ans)
        cout << it << " ";

    cout << endl;

    exit(0);
}

int main()
{
    ios_base::sync_with_stdio(0); istream::sync_with_stdio(0); cin.tie(0); cout.tie(0);

//    freopen("1.in", "r", stdin);
//
//    freopen("1.out", "w", stdout);

    cin >> n >> k;

    bool ft = 1;

    for (int i = 1; i < n; i++)
    {
        int x, y;

        cin >> x >> y;

        if (x > y)
            swap(x, y);

        if (x + 1 != y)
            ft = 0;

        g[x].PB(y);

        g[y].PB(x);
    }

    for (int i = 0; i < k; i++)
    {
        int x;

        cin >> x;

        mk[x] = 1;
    }

    if (ft)
        solve_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...