Submission #654917

#TimeUsernameProblemLanguageResultExecution timeMemory
654917inksamuraiVillage (BOI20_village)C++17
0 / 100
2 ms480 KiB
#include <bits/stdc++.h> #define int ll 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...);} #define all(a) a.begin(),a.end() 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); chs=vi(n,0); ans1=0; pre_rfs(pre_rfs,rt,-1); vi rbts; auto add=[&](auto self,int v,int par)->void{ rbts.pb(v); for(auto u:adj[v]){ if(u==par) continue; self(self,u,v); } }; vi delay={rt}; vi usd(n,0); vi ert1(n); auto ask=[&](auto self,int v,int par)->void{ // print(v,sz(rbts)+sz(delay)); assert(sz(rbts)+sz(delay)); if(sz(delay)){ int s=delay.back(); ert1[s]=v; delay.pop_back(); }else{ int s=rbts.back(); usd[s]=1; ert1[s]=v; rbts.pop_back(); } for(auto u:adj[v]){ if(u==par) continue; self(self,u,v); } }; sort(all(adj[rt]),[&](int l,int r){ return chs[l]<chs[r]; }); for(auto u:adj[rt]){ add(add,u,rt); } per(i,sz(adj[rt])){ int u=adj[rt][i]; vi now; rep(_,chs[u]){ if(!sz(rbts) or usd[rbts.back()]) continue; now.pb(rbts.back()); rbts.pop_back(); } ask(ask,u,rt); for(auto v:now){ delay.pb(v); } } assert(sz(delay)); ert1[delay.back()]=rt; assert(sz(set<int>(all(ert1)))==n); cout<<ans<<" "<<ans1<<"\n"; rep(i,n){ cout<<ert[i]+1<<" "; } print(); auto bfs=[&](int rt)->vi{ vi dist(n,-1); dist[rt]=0; queue<int> que; que.push(rt); while(sz(que)){ int v=que.front(); que.pop(); for(auto u:adj[v]){ if(dist[u]==-1){ dist[u]=dist[v]+1; que.push(u); } } } return dist; }; int now=0; rep(i,n){ now+=(bfs(i)[ert1[i]]); } assert(now==ans1); 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...