Submission #654913

#TimeUsernameProblemLanguageResultExecution timeMemory
654913inksamuraiVillage (BOI20_village)C++17
0 / 100
1 ms468 KiB
#include <bits/stdc++.h> using namespace std; #define rep(i,n) for(int i=0;i<n;i++) #define per(i,n) for(int i=n-1;i>=0;i--) #define rng(i,c,n) for(int i=c;i<n;i++) #define fi first #define se second #define pb push_back #define sz(a) (int)a.size() #define vec(...) vector<__VA_ARGS__> #define _3fm6nhZ ios::sync_with_stdio(0),cin.tie(0) typedef long long ll; using pii=pair<int,int>; using vi=vector<int>; void print(){cout<<'\n';} template<class h,class...t> void print(const h&v,const t&...u){cout<<v<<' ',print(u...);} signed main(){ _3fm6nhZ; int n; cin>>n; vec(vi) adj(n); rep(i,n-1){ int u,v; cin>>u>>v; u-=1,v-=1; adj[u].pb(v); adj[v].pb(u); } int ans=0; vi ert(n); auto dfs=[&](auto self,int v,int par)->int{ vi rbts; for(auto u:adj[v]){ if(u==par) continue; int e=self(self,u,v); if(e) rbts.pb(u); } if(sz(rbts)==0) return 1; for(int i=0;i<sz(rbts)-sz(rbts)%2;i+=2){ ert[rbts[i]]=rbts[i+1]; ert[rbts[i+1]]=rbts[i]; ans+=4; } if(sz(rbts)%2){ ert[v]=rbts.back(); ert[rbts.back()]=v; ans+=2; }else{ ert[v]=rbts.back(); ert[ert[rbts.back()]]=v; } return 0; }; int e=dfs(dfs,0,-1); if(e){ int v=0; int u=adj[0][0]; ans+=2; rep(s,n){ if(ert[s]==u){ ert[v]=u; ert[s]=0; break; } } } int ans1=0; vi chs(n); auto pre_rfs=[&](auto self,int v,int par)->void{ chs[v]=1; for(auto u:adj[v]){ if(u==par) continue; self(self,u,v); chs[v]+=chs[u]; ans1+=2*min(chs[u],n-chs[u]); } }; pre_rfs(pre_rfs,0,-1); auto rfs=[&](auto self,int v,int par)->int{ for(auto u:adj[v]){ if(u==par) continue; if(2*chs[u]>=n){ return self(self,u,v); } } return v; }; int rt=rfs(rfs,0,-1); set<int> st={rt}; vi usd(n,0); auto add=[&](auto self,int v,int par,int x)->void{ if(x==-1){ if(st.find(v)!=st.end()){ st.erase(v); } }else if(usd[v]==0){ st.insert(v); } for(auto u:adj[v]){ if(u==par) continue; self(self,u,v,x); } }; vi ert1(n); auto ask=[&](auto self,int v,int par)->void{ if(st.find(rt)!=st.end()){ ert1[rt]=v; usd[rt]=1; st.erase(rt); }else{ assert(sz(st)); auto it=st.begin(); int s=*it; usd[s]=1; ert1[s]=v; st.erase(it); } for(auto u:adj[v]){ if(u==par) continue; self(self,u,v); } }; for(auto u:adj[rt]){ add(add,u,rt,1); } for(auto u:adj[rt]){ add(add,u,rt,-1); ask(ask,u,rt); add(add,u,rt,1); } assert(sz(st)); ert1[*st.begin()]=rt; cout<<ans<<" "<<ans1<<"\n"; rep(i,n){ cout<<ert[i]+1<<" "; } print(); rep(i,n){ cout<<ert1[i]+1<<" "; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...