Submission #877193

#TimeUsernameProblemLanguageResultExecution timeMemory
877193khueprovipPastiri (COI20_pastiri)C++17
100 / 100
486 ms88344 KiB
#include<bits/stdc++.h>
#define PB push_back
#define maxn 500007
#define bit(x,i) ((x>>i)&1)
#define S second
#define F first
#define MP make_pair
#define epsilon 0.000001

using namespace std;

typedef pair<int,int> pii;
typedef pair<double,double> pdd;
const int inf = 1e18;
const int mod = 1e9+7;
const double PI = acos(-1);

int n,k,dis[maxn],s[maxn],dep[maxn],h[maxn],bio[maxn];
vector<int> adj[maxn];

void readData(){
    cin>>n>>k;
    for (int i=1;i<n;i++){
        int u,v;
        cin>>u>>v;
        adj[u].PB(v);
        adj[v].PB(u);
    }
    for (int i=1;i<=k;i++) cin>>s[i];
}

void dfs_init(int x, int p, int mx, int opt){
    int sum=dep[x]+dis[x];
    if (sum>mx){
        mx=sum;
        opt=x;
    }
    h[x]=opt;
    for (auto v:adj[x]){
        if (v==p) continue;
        dep[v]=dep[x]+1;
        dfs_init(v,x,mx,opt);
    }
}

void bfs(){
    memset(dis,-1,sizeof(dis));
    queue<int> q;
    for (int i=1;i<=k;i++){
        dis[s[i]]=0;
        q.push(s[i]);
    }
    while (q.size()){
        int u=q.front();
        q.pop();
        for (auto v:adj[u]){
            if (dis[v]!=-1) continue;
            dis[v]=dis[u]+1;
            q.push(v);
        }
    }
}

bool cmp(int x, int y){
    return dep[x]>dep[y];
}

void dfs_cover(int x){
    bio[x]=1;
    for (auto v:adj[x])
        if (!bio[v]&&dis[x]==dis[v]+1) dfs_cover(v);
}

void solve(){
    bfs();
    dfs_init(1,0,-1,0);
    sort(s+1,s+k+1,cmp);
    vector<int> ans;
    for (int i=1;i<=k;i++){
        if (bio[s[i]]) continue;
        ans.PB(h[s[i]]);
        dfs_cover(h[s[i]]);
    }
    cout<<ans.size()<<"\n";
    for (auto x:ans) cout<<x<<" ";
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    //freopen("SHEEP.inp","r",stdin);
    //freopen(".out","w",stdout);
    readData();
    solve();
    return 0;
}
/*
               _oo0oo_
              o8888888o
              88" . "88
              (| -_- |)
              0\  =  /0
            ___/`---'\___
          .' \\|     |// '.
         / \\|||  :  |||// \
        / _||||| -:- |||||- \
       |   | \\\  -  /// |   |
       | \_|  ''\---/''  |_/ |
       \  .-\__  '-'  ___/-. /
     ___'. .'  /--.--\  `. .'___
  ."" '<  `.___\_<|>_/___.' >' "".
 | | :  `- \`.;`\ _ /`;.`/ - ` : | |
 \  \ `_.   \_ __\ /__ _/   .-` /  /
=====`-.____`.___ \_____/___.-`___.-'=====
               `=---='
*/

Compilation message (stderr)

pastiri.cpp:14:17: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   14 | const int inf = 1e18;
      |                 ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...