#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=500000;
int nex[maxn];
int v[maxn];
int hd[maxn],ct;
int n,b,a;
int col[maxn],ans[maxn],cnt[maxn],fa[maxn],bs[maxn],sz[maxn];
int size;
int num,sum;
int son;
inline void read(int &x)
{
x = 0;int f = 1;
char ch = getchar();
while(!isdigit(ch)){if(ch == '-')f = -1; ch = getchar();}
while(isdigit(ch)){x = (x<<3) + (x<<1) + ch - '0'; ch = getchar();}
x = x*f;
}
void add(int from, int to)
{
v[++ct]=to;
nex[ct]=hd[from];
hd[from]=ct;
}
void dfs1(int nw, int en)
{
fa[nw]=en;
sz[nw]=1;
size=-1;
for (int i=hd[nw]; i; i=nex[i])
{
int to=v[i];
if (to==en) continue;
dfs1(to,nw);
sz[nw]+=sz[to];
if (sz[to] > size)
{
size=sz[to];
bs[nw]=to;
}
}
}
inline void calu(int u,int val)
{
cnt[col[u]]+=val;
if (cnt[col[u]] > num )
{
num=cnt[col[u]] ;
sum=col[u];
}
else if (cnt[col[u]]==num)
sum+=col[u];
for (int i=hd[u]; i; i=nex[i])
{
int to=v[i];
if (to==fa[u] || to==son)
continue;
calu(to,val);
}
}
void dfs2(int u,int val)
{
for (int i=hd[u]; i; i=nex[i])
{
int to=v[i];
if (to==fa[u] || to==bs[u]) continue;
dfs2(to,0);
}
if (bs[u]) dfs2(bs[u],1),son=bs[u];
calu(u,1);
ans[u]=sum;
son=0;
if (!val)
{
calu(u,-1);
num=0;
sum=0;
}
}
int main ()
{
cin >> n;
for (int i=1;i<=n;i++)
read(col[i]);
for (int i=1;i<n;i++)
{
read(a);
read(b);
add(a,b);
add(b,a);
}
dfs1(1,0);
dfs2(1,0);
for (int i=1;i<=n;i++)
printf("%d ",ans[i]);
return 0;
}
已经照着题解改了,,,,但,,,
哪里是不是写错了啊?
快把孩子逼疯了,一晚上就写了个tle