WA四个点。
code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,m,rt,a[maxn],b[maxn],siz[maxn],son[maxn],cnt[maxn],ans[maxn],sum;
vector<int> edge[maxn];
void dfs1(int x,int p)
{
siz[x]=1;
son[x]=-1;
for (auto v:edge[x])
{
if (v==p)
continue;
dfs1(v,x);
siz[x]+=siz[v];
if (son[x]==-1||siz[son[x]]<siz[v])
son[x]=v;
}
}
void add(int u,int p,int x)
{
cnt[a[u]]+=x;
if (cnt[a[u]]==1)
sum++;
if (!cnt[a[u]])
sum--;
for (auto v:edge[u])
{
if (v==p)
continue;
add(v,u,x);
}
}
void dfs2(int x,int p,int kp)
{
for (auto v:edge[x])
{
if (v==p||v==son[x])
continue;
dfs2(v,x,0);
}
if (son[x]!=-1)
dfs2(son[x],x,1);
cnt[a[x]]++;
if (cnt[a[x]]==1)
sum++;
for (auto v:edge[x])
{
if (v==p||v==son[x])
continue;
add(v,x,1);
}
ans[x]=sum;
if (!kp)
add(x,p,-1);
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for (int i=1;i<=n;i++)
cin>>a[i],b[i]=a[i];
for (int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
edge[x].push_back(y);
edge[y].push_back(x);
}
sort(b+1,b+n+1);
int cnt=unique(b+1,b+n+1)-(b+1);
for (int i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
dfs1(1,0);
dfs2(1,0,1);
for (int i=1;i<=n;i++)
cout<<ans[i]<<' ';
return 0;
}