Submission #802151

#TimeUsernameProblemLanguageResultExecution timeMemory
802151amirhoseinfar1385Village (BOI20_village)C++17
100 / 100
72 ms23336 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
vector<int>adj[maxn];
int n,m,sz[maxn],linkmin[maxn],linkmax[maxn];
vector<vector<int>>allk;
long long res=0;

void dfs(int u,int par=0)
{
	sz[u]=1;
	for(auto x:adj[u]){
		if(x!=par){
			dfs(x,u);
			sz[u]+=sz[x];
		}
	}
}

int findcen(int u,int ted,int par=0){
	//cout<<u<<" "<<ted<<" "<<par<<" "<<sz[u]<<endl;
	for(auto x:adj[u]){
		if(x!=par&&sz[x]*2>=ted){
			return findcen(x,ted,u);
		}
	}
	//cout<<u<<endl;
	return u;
}

int finds(){
	dfs(1);
	//cout<<"salam"<<endl;
	return findcen(1,sz[1]);
}

int solve(int u,int rishe,int par=0){
	if(u!=rishe){
		allk.back().push_back(u);
	}
	int ret=1;
	for(auto x:adj[u]){
		if(x!=par){
			if(u==rishe){
				allk.push_back({});
			}
			int z=solve(x,rishe,u);
			res+=2*z;
			ret+=z;
		}
	}
	return ret;
}

long long res2=0;

int solve2(int u,int par=0){
	vector<int>v;
	v.push_back(u);
	for(auto x:adj[u]){
		if(x!=par){
			if(solve2(x,u)==1){
				v.push_back(x);
			}
		}
	}
	if((int)v.size()==1){
		return 1;
	}
	int sz=(int)v.size();
	res2+=sz*2-2;
	for(int j=0;j<sz;j++){
		linkmin[v[j]]=v[(j+1)%sz];
	}
	return 0;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=0;i<n-1;i++){
		int u,v;
		cin>>u>>v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	int r=finds();
	//cout<<"salam"<<endl;
	solve(r,r);
	int f=solve2(1);
	if(f==1){
		int wtf=adj[1][0];
		for(int j=1;j<=n;j++){
			if(linkmin[j]==wtf){
				wtf=j;
				break;
			}
		}
		linkmin[wtf]=1;
		linkmin[1]=adj[1][0];
		res2+=2;
	}
	cout<<res2<<" "<<res<<"\n";
	for(int i=1;i<=n;i++){
		cout<<linkmin[i]<<" ";
	}
	cout<<"\n";
	set<pair<int,int>>st;
	for(int i=0;i<(int)allk.size();i++){
		st.insert(make_pair((int)allk[i].size(),i));
	}
	//cout<<"salam"<<endl;
	while((int)st.size()>1){
		auto x=*st.rbegin();
		st.erase(x);
		auto y=*st.rbegin();
		st.erase(y);
		linkmax[allk[y.second].back()]=allk[x.second].back();
		linkmax[allk[x.second].back()]=allk[y.second].back();
		allk[x.second].pop_back();
		allk[y.second].pop_back();
		x.first--;
		y.first--;
		if(x.first>0){
			st.insert(x);
		}
		if(y.first>0){
			st.insert(y);
		}
	}
	if((int)st.size()>0){
		auto x=*st.rbegin();
		int z=allk[x.second].back();
		linkmax[z]=r;
		linkmax[r]=z;
	}
	else{
		if(r!=1){
			linkmax[r]=1;
			linkmax[linkmax[1]]=r;
		}
		else{
			linkmax[r]=2;
			linkmax[linkmax[2]]=r;
		}
	}
	for(int i=1;i<=n;i++){
		cout<<linkmax[i]<<" ";
	}
	cout<<"\n";
}	
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...