1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include<bits/stdc++.h> #define int long long using std::vector; typedef vector<int> vi; typedef long long ll; template<typename Tp=int>inline Tp read(){Tp x(0);int op(0);char ch=getchar();while(ch<'0'||ch>'9')op|=(ch==45),ch=getchar();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return op?-x:x;}
signed main(){ int n=read(); vi a(n+1); vector<vi> G(n+1); for(int i=1;i<=n;++i)a[i]=read(); for(int i=1;i<n;++i){ int u=read(),v=read(); G[u].push_back(v),G[v].push_back(u); } vi siz(n+1),son(n+1),buc(n+1); vector<ll> ans(n+1); std::function<void(int,int)> gson=[&](int u,int f){ siz[u]=1; for(auto v:G[u])if(v!=f){ gson(v,u); siz[u]+=siz[v]; if(siz[son[u]]<siz[v])son[u]=v; } }; vi use; ll cur=0,maxn=0; std::function<void(int,int)> dfs=[&](int u,int f){ auto add=[&](int x){ use.push_back(a[x]); buc[a[x]]++; if(buc[a[x]]>maxn)cur=a[x],maxn=buc[a[x]]; else if(buc[a[x]]==maxn)cur+=a[x]; }; auto clr=[&](){ for(auto v:use)buc[v]=0; cur=maxn=0; use.clear(); }; std::function<void(int,int)> df=[&](int u,int f){ add(u); for(auto v:G[u])if(v!=f)df(v,u); }; for(auto v:G[u])if(v!=f&&v!=son[u])dfs(v,u),clr(); if(son[u])dfs(son[u],u); for(auto v:G[u])if(v!=f&&v!=son[u])df(v,u); add(u),ans[u]=cur; };gson(1,0),dfs(1,0); for(int i=1;i<=n;++i)printf("%lld ",ans[i]); return 0; }
|