代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=400500;
bool jud[M];
int n,rt,f[M];
int siz[M],msz,poi,mkz;
vector<int>v[M];
inline int read()
{
int x=0;char ch=getchar();
while (ch>'9'||ch<'0') ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
inline void add(int a,int b){return (void)(v[a].push_back(b);v[b].push_back(a));}
inline void dfs(int x,int fa)
{
siz[x]=1;f[x]=fa;int fl=1;
for (int i=0;i<v[x].size();i++)
{
int go=v[x][i];
if (go==fa) continue;
dfs(go,x);siz[x]+=siz[go];
if (siz[go]>n/2) fl=0;
}
if (fl&&siz[x]>(n-1)/2) rt=x;
return ;
}
inline void then(int x)
{
for (int i=0;i<v[x].size();i++)
{
int go=v[x][i];
if (siz[go]>msz) msz=siz[go],poi=go;
}
for (int i=0;i<v[x].size();i++)
{
int go=v[x][i];
if (siz[go]>mkz&&go!=poi) mkz=siz[go];
}
return ;
}
inline void get(int x,int fl)
{
if (x==poi) fl=1;
if (fl) siz[x]+=mkz;
else siz[x]+=msz;
if (siz[x]>(n-1)/2) jud[x]=1;
if (fl&&msz*2==n) jud[x]=1;
for (int i=0;i<v[x].size();i++)
{
int go=v[x][i];
if (go==f[x]) continue;
get(go,fl);
}
return ;
}
int main()
{
n=read();int a,b;
for (int i=1;i<n;i++)
a=read(),b=read(),add(a,b);
dfs(1,0);
if (rt!=1) memset(siz,0,sizeof(siz)),dfs(rt,0);
then(rt);get(rt,0);
for (int i=1;i<=n;i++)
printf("%d ",(int)(jud[i]));
return 0;
}