rt,在测评机上看是 WA,但样例下下来之后在 windows 环境下莫名其妙会挂掉,检查之后发现是在 dfs1 就挂了,于是万分不解求大佬指点 QAQ!
#include<vector>
#include<iostream>
#define int long long
using namespace std;
const int N=1e5+5;
struct Edge{
int l,nxt;
}edges[N<<1];
int n,tt=1,head[N],tr[N],anu[N];
int rt,sum,maxn,siz[N],del[N];
int du[N],son[N],dep[N];
vector<int> vo;
void add_edge(int f,int l){
edges[++tt]={l,head[f]};
head[f]=tt;
}
int lowbit(int x){return x&-x;}
void add(int x,int k){
for(;x<=2*n;x+=lowbit(x)) tr[x]+=k;
}
int Find(int x,int k=0){
for(;x;x-=lowbit(x)) k+=tr[x];
return k;
}
void dfs1(int x,int fa){
for(int i=head[x];i;i=edges[i].nxt){
int l=edges[i].l;if(l==fa) continue;
dfs1(l,x);son[x]=min(son[x],son[l]+1);
}
}
void dfs2(int x,int fa){
for(int i=head[x];i;i=edges[i].nxt){
int l=edges[i].l;if(l==fa) continue;
son[l]=min(son[l],son[x]+1);dfs2(l,x);
}
}
void Findrt(int x,int fa){
siz[x]=1;int an=0;
for(int i=head[x];i;i=edges[i].nxt){
int l=edges[i].l;
if(l==fa||del[l]) continue;
Findrt(l,x);siz[x]+=siz[l];
an=max(an,siz[l]);
}
an=max(an,sum-siz[x]);
if(an<maxn) maxn=an,rt=x;
}
void dfs(int x,int fa){
vo.push_back(x);dep[x]=dep[fa]+1;
for(int i=head[x];i;i=edges[i].nxt){
int l=edges[i].l;
if(l==fa||del[l]) continue;
dfs(l,x);
}
}
void calc(int x,int tot){
dep[0]=(tot==1?-1:0);dfs(x,0);
for(int i=0;i<vo.size();i++){
int l=vo[i];
add(son[l]-dep[l]+n,tot*(2-du[l]));
}
for(int i=0;i<vo.size();i++){
int l=vo[i];
add(son[l]-dep[l]+n,-tot*(2-du[l]));
anu[l]+=Find(dep[l]+n);
// cout<<l<<"&&&"<<anu[l]<<endl;
add(son[l]-dep[l]+n,tot*(2-du[l]));
}
for(int i=0;i<vo.size();i++){
int l=vo[i];
add(son[l]-dep[l]+n,-tot*(2-du[l]));
}
vo.clear();
}
void solve(int x){
del[x]=1;calc(x,1);
for(int i=head[x];i;i=edges[i].nxt){
int l=edges[i].l;if(del[l]) continue;
calc(l,-1);
sum=maxn=siz[l];rt=l;
Findrt(l,x);solve(rt);
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;int f,l;
for(int i=1;i<n;i++){
cin>>f>>l;du[f]++,du[l]++;
add_edge(f,l);add_edge(l,f);
}
for(int i=1;i<=n;i++) son[i]=(du[i]==1?0:2147483647);
dfs1(1,0);dfs2(1,0);
sum=maxn=n;rt=1;Findrt(1,0);solve(rt);
for(int i=1;i<=n;i++) cout<<((!son[i])?1:anu[i])<<endl;
return 0;
}