#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()
const int maxn=1e5+10;
int n;
vector<vi> graph(maxn);
vi sze(maxn,1);
void dfs(int cur, int prev=-1) {
for (auto to:graph[cur]) {
if (to==prev) {
continue;
}
dfs(to,cur);
sze[cur]+=sze[to];
}
}
vector<vi> dp(maxn,vi(2,1e9));
vi to(maxn,-1);
void dfs2(int cur, int prev=-1) {
if (graph[cur].size()==1 && cur!=0) {
dp[cur][1]=0;
return;
}
int cnt=0;
int diff=1e9;
for (auto to:graph[cur]) {
if (to==prev) {
continue;
}
dfs2(to,cur);
cnt+=min(dp[to][0],dp[to][1]+2);
if (dp[to][1]+2<=dp[to][0]) {
diff=0;
}
else {
diff=min(diff,dp[to][1]+2-dp[to][0]);
}
}
dp[cur][1]=cnt;
dp[cur][0]=cnt+diff;
}
pi dfs3(int ii, int cur, int prev=-1) {
vector<pi> out={{cur,cur}};
int t=-1;
if (ii==0 && dp[cur][0]!=dp[cur][1]) {
for (auto to:graph[cur]) {
if (to==prev) {
continue;
}
if (dp[to][1]+2-dp[to][0]==dp[cur][0]-dp[cur][1]) {
t=to;
break;
}
}
}
for (auto to:graph[cur]) {
if (to==prev) {
continue;
}
if (to==t || dp[to][1]+2<=dp[to][0]) {
out.pb(dfs3(1,to,cur));
}
else {
dfs3(0,to,cur);
}
}
int prv=out.size()-1;
for (int i=0; i<out.size(); i++) {
to[out[i].fi]=out[prv].se;
prv=i;
}
return {out[0].fi,to[out[0].fi]};
}
vi to2(maxn,0);
int dfs4(int cur, int prev=-1) {
bool ok=1;
for (auto to:graph[cur]) {
if (to==prev) {
continue;
}
int temp=dfs4(to,cur);
if (temp!=-1) {
return temp;
}
if (sze[to]>n/2) {
ok=0;
}
}
if (ok && n-sze[cur]<=n/2) {
return cur;
}
return -1;
}
vector<vector<pi>> comp;
void dfs5(int cur, int prev=-1) {
comp.back().pb({cur,cur});
for (auto to:graph[cur]) {
if (to==prev) {
continue;
}
dfs5(to,cur);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
int a,b;
for (int i=0; i<n-1; i++) {
cin >> a >> b;
graph[--a].pb(--b);
graph[b].pb(a);
}
dfs(0);
dfs2(0);
dfs3(0,0);
int cen=dfs4(0);
assert(cen!=-1);
comp.pb({{cen,cen}});
for (auto to:graph[cen]) {
comp.pb({});
dfs5(to,cen);
}
vi ord(comp.size());
iota(all(ord),0);
sort(all(ord),[&](int a, int b){return comp[a].size()>comp[b].size();});
int pt1=0,pt2=1;
pi temp={-1,-1};
while (pt1<comp.size() && pt2<comp.size()) {
while (pt1<comp.size() && comp[ord[pt1]].size()==0) {
pt1++;
}
while (pt2<comp.size() && (comp[ord[pt2]].size()==0 || pt1==pt2)) {
pt2++;
}
if (pt1==comp.size() || pt2==comp.size()) {
break;
}
if (comp[ord[pt1]].size()<comp[ord[pt2]].size()) {
swap(pt1,pt2);
}
while (comp[ord[pt2]].size()) {
pi a=comp[ord[pt1]].back();
comp[ord[pt1]].pop_back();
pi b=comp[ord[pt2]].back();
comp[ord[pt2]].pop_back();
to2[a.fi]=b.se;
to2[b.fi]=a.se;
if (comp[ord[pt2]].size()==0 && comp[ord[pt1]].size()==0) {
temp={b.fi,a.se};
}
}
}
if (pt1<comp.size() && comp[ord[pt1]].size()) {
pi a=comp[ord[pt1]].back();
comp[ord[pt1]].pop_back();
to2[a.fi]=temp.se;
to2[temp.fi]=a.se;
}
if (pt2<comp.size() && comp[ord[pt2]].size()) {
pi a=comp[ord[pt2]].back();
comp[ord[pt2]].pop_back();
to2[a.fi]=temp.se;
to2[temp.fi]=a.se;
}
ll ans2=0;
for (int i=1; i<n; i++) {
ans2+=2*min(sze[i],n-sze[i]);
}
cout << dp[0][0] << ' ' << ans2 << '\n';
for (int i=0; i<n; i++) {
cout << to[i]+1 << " \n"[i==n-1];
}
for (int i=0; i<n; i++) {
cout << to2[i]+1 << " \n"[i==n-1];
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |