제출 #1370631

#제출 시각아이디문제언어결과실행 시간메모리
1370631eradaxVillage (BOI20_village)C++20
100 / 100
78 ms34972 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main() {
    cin.tie(0)->sync_with_stdio(0);
    int n;cin>>n;
    vector<vector<int>> adj(n);
    vector<int> d(n);
    for(int i=1;i<n;i++){
        int u,v;cin>>u>>v;u--,v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
        d[u]++,d[v]++;
    }
    int ans_mi=0;
    vector<int>p_mi(n,-1);
    {
        vector<unordered_set<int>> adjc(n);
        for(int i=0;i<n;i++)adjc[i].insert(begin(adj[i]),end(adj[i]));
        vector<vector<int>> ch(n);
        vector<int> vis(n),leaf;
        for(int i=0;i<n;i++)if(d[i]==1)leaf.push_back(i);
        while(ssize(leaf)){
            vector<int> nl;
            ans_mi+=ssize(leaf);

            for(int i:leaf){
                // cerr<<"LEAF = "<<i<<endl;
                if(ssize(ch[i])){
                    ans_mi+=ssize(ch[i])-1;
                    p_mi[ch[i][0]]=i;
                    for(int j=0;j<ssize(ch[i])-1;j++)p_mi[ch[i][j+1]]=ch[i][j];
                    p_mi[i]=ch[i].back();

                    d[i]--;
                    if (ssize(adjc[i])) {
                        int v=*adjc[i].begin();
                        adjc[v].erase(i);
                        adjc[i].erase(adjc[i].begin());
                        d[v]--;
                        // assert(d[i]==0);
                        if(d[v]==1)nl.push_back(v);
                    }
                } else if (ssize(adjc[i])) {
                    ch[*adjc[i].begin()].push_back(i);
                    d[i]--;
                    int v=*adjc[i].begin();
                    adjc[v].erase(i);
                    adjc[i].erase(adjc[i].begin());
                    d[v]--;
                    // assert(d[i]==0);
                    if(d[v]==1)nl.push_back(v);
                } else {
                    d[i]--;
                    ans_mi++;
                    int v=*adj[i].begin();
                    p_mi[i]=p_mi[v];
                    p_mi[v]=i;
                }
            }

            leaf=nl;
        }
    }

    ll ans_ma=0;
    vector<int>p_ma(n,-1);
    {
        vector<int> sz(n);
        auto dfs=[&](auto&& self, int u,int p)->int{
            sz[u]=1;
            for(int&i:adj[u])if(i!=p)sz[u]+=self(self,i,u);
            if(u!=0)ans_ma+=2*min(sz[u],n-sz[u]);
            return sz[u];
        };
        dfs(dfs,0,-1);

        int p=-1;
        int u=0;
        while(1) {
            int f=1;
            for(int v:adj[u])if(v!=p&&sz[v]>n/2){f=1,p=u,u=v;break;}
            if(f)break;
        }

        vector<int> ord;
        auto df=[&](auto&& self,int u,int p)->void{
            ord.push_back(u);
            for(int i:adj[u])if(i!=p)self(self,i,u);
        };
        df(df,u,-1);
        for(int i=0;i<n;i++)p_ma[ord[i]]=ord[(i+n/2)%n];
    }

    cout<<ans_mi<<' '<<ans_ma<<'\n';
    for(int i:p_mi)cout<<i+1<<' ';
    cout<<'\n';
    for(int i:p_ma)cout<<i+1<<' ';
    cout<<'\n';
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…