记录编号 |
602373 |
评测结果 |
AAAAAAAAAA |
题目名称 |
4165.一无所有 |
最终得分 |
100 |
用户昵称 |
左清源 |
是否通过 |
通过 |
代码语言 |
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;
}