Submission #1204693

#TimeUsernameProblemLanguageResultExecution timeMemory
1204693UnforgettableplVillage (BOI20_village)C++20
100 / 100
69 ms14876 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long


int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int N;
    cin >> N;
    vector<vector<int>> adj(N+1);
    for(int i=1;i<N;i++){
        int u,v;
        cin >> u >> v;
        adj[u].emplace_back(v);
        adj[v].emplace_back(u);
    }
    int answer1 = 0;
    vector<int> answer1vec(N+1);
    {
        // answer 1
        int centroid = -1;
        {
            auto dfs = [&](auto&& self,int x,int p)->int{
                int siz = 1;
                for(int&i:adj[x])if(i!=p)siz+=self(self,i,x);
                if((N-siz)<=N/2){
                    centroid = x;
                    return -1e10;
                }
                return siz;
            };
            dfs(dfs,1,0);
        }
        vector<int> curr(N+1);
        int idx = -1;
        auto dfs = [&](auto&& self,int x,int p,int dep)->void{
            if(++idx>N/2){
                answer1vec[curr[idx-N/2]]=x;
                answer1vec[x]=curr[idx-N/2];
            } else curr[idx]=x;
            answer1+=2ll*dep;
            for(int&i:adj[x])if(i!=p)self(self,i,x,dep+1);
        };
        dfs(dfs,centroid,0,0);
        if(N&1){
            answer1vec[centroid]=answer1vec[curr[1]];
            answer1vec[curr[1]]=centroid;
        } else {
            answer1vec[curr[N/2]]=centroid;
            answer1vec[centroid]=curr[N/2];
        }
    }
    int answer2 = 0;
    vector<int> answer2vec(N+1);
    {
        iota(answer2vec.begin(),answer2vec.end(),0);
        auto addInChain = [&](int x,int y){
            answer2vec[y]=answer2vec[x];
            return answer2vec[x]=y;
        };
        auto dfs = [&](auto&& self,int x,int p)->bool{
            vector<int> childrenNeeding;
            for(int&i:adj[x])if(i!=p){
                if(self(self,i,x))childrenNeeding.emplace_back(i);
            }
            if(childrenNeeding.empty())return true;
            int last = x;
            for(int&i:childrenNeeding)last=addInChain(last,i);
            answer2+=(int)childrenNeeding.size()*2ll;
            return false;
        };
        if(dfs(dfs,1,0)){
            addInChain(adj[1][0],1);
            answer2+=2;
        }
    }
    cout << answer2 << ' ' << answer1 << '\n';
    for(int i=1;i<=N;i++)cout<<answer2vec[i]<<' ';
    cout << '\n';
    for(int i=1;i<=N;i++)cout<<answer1vec[i]<<' ';
    cout << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...