听取MLE声一片 @ 2021-08-18 23:17:03
在第67个点T了,求调
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<complex>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void write(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10|'0');
}
const int N=2e6+10;
const int M=2e7+10;
int n,head[N],nex[N<<1],to[N<<1],dep[N],cnt,tot;
int a[M],id[M],root[N],lc[M],rc[M],ans[N];
inline void add(int u,int v){
nex[++cnt]=head[u];
head[u]=cnt;
to[cnt]=v;
}
void dfs1(int u,int fa){
dep[u]=dep[fa]+1;
for(int e=head[u];e;e=nex[e]){
int v=to[e];
if(v==fa)
continue;
dfs1(v,u);
}
}
void query(int &p,int l,int r,int x,int val){
if(!p)
p=++tot;
if(l==r){
a[p]+=val;
id[p]=x;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)
query(lc[p],l,mid,x,val);
else query(rc[p],mid+1,r,x,val);
if(a[lc[p]]>=a[rc[p]]){
a[p]=a[lc[p]];
id[p]=id[lc[p]];
}
else{
a[p]=a[rc[p]];
id[p]=id[rc[p]];
}
}
int merge(int x,int y,int l,int r){
if(!x)
return y;
if(!y)
return x;
if(l==r){
a[x]+=a[y];
id[x]=l;
return x;
}
int mid=(l+r)>>1;
lc[x]=merge(lc[x],lc[y],l,mid);
rc[x]=merge(rc[x],rc[y],mid+1,r);
if(a[lc[x]]>=a[rc[x]]){
a[x]=a[lc[x]];
id[x]=id[lc[x]];
}
else{
a[x]=a[rc[x]];
id[x]=id[rc[x]];
}
return x;
}
void dfs2(int u,int fa){
query(root[u],1,n,dep[u],1);
for(int e=head[u];e;e=nex[e]){
int v=to[e];
if(v==fa)
continue;
dfs2(v,u);
root[u]=merge(root[u],root[v],1,n);
}
ans[u]=id[root[u]]-dep[u];
}
int main()
{
n=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
add(u,v);
add(v,u);
}
dfs1(1,0);
dfs2(1,0);
for(int i=1;i<=n;i++){
write(ans[i]);putchar('\n');
}
return 0;
}