记录编号 602373 评测结果 AAAAAAAAAA
题目名称 4165.一无所有 最终得分 100
用户昵称 Gravatar左清源 是否通过 通过
代码语言 C++ 运行时间 1.376 s
提交时间 2025-07-03 19:27:15 内存使用 10.74 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,deg[N],val[N],vis[N],rt,t,lim;
int siz[N],mx[N],c[N*3],g[N],ans[N];
vector<int>G[N];
struct node{int x,fx,dx,gx;}a[N];// gx=g[x]-d[x]
bool cmp(node a,node b){return a.fx<b.fx;}
void link(int x,int y){
	G[x].push_back(y);
}
void add(int x,int y){
	for(;x<=lim;x+=(x&-x))c[x]+=y;
}
int ask(int x){
	int cnt=0;for(;x>0;x-=(x&-x))cnt+=c[x];return cnt;
}
void dfs1(int x,int fa){
	if(deg[x]==1)g[x]=0;
	else g[x]=1e9;
	for(auto y:G[x]){
		if(y==fa)continue;
		dfs1(y,x);
		g[x]=min(g[x],g[y]+1);
	}
	val[x]=2-deg[x];
	return;
}
void dfs2(int x,int fa){
	for(auto y:G[x]){
		if(y==fa)continue;
		g[y]=min(g[y],g[x]+1);
		dfs2(y,x);
	}
	return;
}
void dfsrt(int x,int fa,int sum){
	siz[x]=1,mx[x]=0;
	for(auto y:G[x]){
		if(y==fa||vis[y])continue;
		dfsrt(y,x,sum),siz[x]+=siz[y];
		mx[x]=max(mx[x],siz[y]);
	}
	mx[x]=max(mx[x],sum-siz[x]);
	if(mx[x]<mx[rt])rt=x;
}
void dfsdis(int x,int fa,int d,int from){
	a[++t]=node{x,from,d,g[x]-d};
	for(auto y:G[x]){
		if(y==fa||vis[y])continue;
		dfsdis(y,x,d+1,from);
	}
	return;
}
void calc(int u){
	a[t=1]=node{u,u,0,g[u]};
	for(auto v:G[u]){
		if(vis[v]||v==u)continue;
		dfsdis(v,u,1,v);
	}
	sort(a+1,a+1+t,cmp);int i,j;
	for(i=1,j=1;i<=t;i++){
		while(j<=t&&a[j].fx<a[i].fx)add(n+1+a[j].gx,val[a[j].x]),j++;
		ans[a[i].x]+=ask(n+1+a[i].dx); 
	}
	for(int k=1;k<j;k++)add(n+1+a[k].gx,-val[a[k].x]);
	for(i=t,j=t;i>=1;i--){
		while(j>=1&&a[j].fx>a[i].fx)add(n+1+a[j].gx,val[a[j].x]),j--;
		ans[a[i].x]+=ask(n+1+a[i].dx);
	}
	for(int k=t;k>j;k--)add(n+1+a[k].gx,-val[a[k].x]);
	return;
}
void solve(int x,int tot){
	vis[x]=1;
	calc(x);
	for(auto y:G[x]){
		if(vis[y])continue;
		int tmp=(siz[y]>siz[x]?tot-siz[x]:siz[y]); 
		rt=0;dfsrt(y,x,tmp);
		solve(rt,tmp);
	}
	return;
}
int main(){
	freopen("nothing.in","r",stdin);
	freopen("nothing.out","w",stdout); 
	scanf("%d",&n);
	for(int i=1,u,v;i<n;i++){
		scanf("%d %d",&u,&v);
		link(u,v),link(v,u);
		deg[u]++,deg[v]++;
	}
	lim=2*n+1;
	dfs1(1,0);
	dfs2(1,0);
	mx[0]=1e9;dfsrt(1,0,n);
	solve(rt,n);
	for(int i=1;i<=n;i++){
		if(deg[i]==1)printf("1\n");
		else printf("%d\n",ans[i]);
	}
	return 0;
}