有没有可能是复杂度问题?
卡的我怀疑人生……
还请各位大佬看一下。
(还有吐槽一下CF一个题怎么设这么多点)
#include<bits/stdc++.h>
const int maxn=1e6+10;
int n,ans[maxn],tot,rt[maxn],Max;
int beg[maxn],nex[maxn<<1],to[maxn<<1],e;
inline void add(int x,int y){
e++;nex[e]=beg[x];beg[x]=e;to[e]=y;
}
int dep[maxn];
struct node{
int val,l,r;
}tr[maxn*20];
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
return x*f;
}
inline int update(int h,int l,int r,int x){
if(!h)h=++tot;
if(l==r){tr[h].val++;return h;}
int mid=(l+r)>>1;
if(mid>=x)tr[h].l=update(tr[h].l,l,mid,x);
else tr[h].r=update(tr[h].r,mid+1,r,x);
tr[h].val=std::max(tr[tr[h].l].val,tr[tr[h].r].val);
return h;
}
inline int merge(int a,int b,int l,int r){
if(!a)return b;
if(!b)return a;
if(l==r){
tr[a].val+=tr[b].val;
return a;
}
int mid=(l+r)>>1;
tr[a].l=merge(tr[a].l,tr[b].l,l,mid);
tr[a].r=merge(tr[a].r,tr[b].r,mid+1,r);
tr[a].val=std::max(tr[tr[a].l].val,tr[tr[a].r].val);
return a;
}
inline int query(int h,int l,int r){
if(l==r)return l;
int mid=(l+r)>>1;
if(tr[tr[h].l].val>=tr[tr[h].r].val)
return query(tr[h].l,l,mid);
else return query(tr[h].r,mid+1,r);
}
inline void trydeep(int x,int fa){
dep[x]=dep[fa]+1;
for(register int i=beg[x];i;i=nex[i])
if(to[i]!=fa)trydeep(to[i],x);
Max=Max<dep[x]?dep[x]:Max;
}
inline void dfs(int x,int fa){
rt[x]=update(rt[x],1,Max,dep[x]);
for(register int i=beg[x];i;i=nex[i]){
int t=to[i];
if(t==fa)continue;
dfs(t,x);
rt[x]=merge(rt[x],rt[t],1,Max);
}
ans[x]=query(rt[x],1,Max);
}
int main(){
n=read();
int x,y;
for(register int i=1;i<n;i++){
x=read(),y=read();
add(x,y),add(y,x);
}
trydeep(1,0);
dfs(1,0);
for(register int i=1;i<=n;i++)
printf("%d\n",ans[i]-dep[i]);
return 0;
}