在 codeforces 上面评测结果是第 88 个测试点 TLE
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int head[N];
int nxt[N];
int to[N];
int id;
void add(int x,int y)
{
nxt[++id] = head[x];
head[x] = id;
to[id] = y;
}
int maxn;
int tot;
int cnt[N];
int son[N];
int dep[N];
int siz[N];
void dfs(int u,int fa){
siz[u] = 1;
dep[u] = dep[fa] + 1;
for(register int i = head[u];i;i = nxt[i])
{
int v = to[i];
if(v == fa)continue;
dfs(v,u);
siz[v] += siz[u];
if(siz[son[u]] < siz[v])
{
son[u] = v;
}
}
}
int Son;
void update(int u,int fa,int val)
{
cnt[dep[u]] += val;
if(cnt[dep[u]] > maxn)
{
maxn = cnt[dep[u]];
tot = dep[u];
}
else if(cnt[dep[u]] == maxn && dep[u] < tot)
{
tot = dep[u];
}
for(register int i = head[u];i;i = nxt[i])
{
int v = to[i];
if(v == fa || v == Son)continue;
update(v,u,val);
}
}
int ans[N];
void dsu(int u,int fa,int opt)
{
for(register int i = head[u];i;i = nxt[i])
{
int v = to[i];
if(v == fa || v == son[u])continue;
dsu(v,u,0);
}
if(son[u])
{
dsu(son[u],u,1);
}
Son = son[u];
update(u,fa,1);
Son = 0;
//cout << maxn << endl;
ans[u] = tot - dep[u];
if(opt == 0)
{
update(u,fa,-1);
tot = maxn = 0;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
for(register int i = 1;i < n;i++)
{
int u,v;
cin >> u >> v;
add(u,v);
add(v,u);
}
dfs(1,0);
dsu(1,0,1);
for(register int i = 1;i <= n;i++)
{
cout << ans[i] << endl;
}
return 0;
}