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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10; const double pi = 3.1415926535897932384626433832795; const double eln = 2.718281828459045235360287471352;
#define f(i, a, b) for (int i = a; i <= b; i++) #define scan(x) scanf("%d", &x) #define mp make_pair #define pb push_back #define lowbit(x) (x&(-x))
#define fi first #define se second #define SZ(x) int((x).size()) #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define summ(a) (accumulate(all(a), 0ll))
typedef unsigned long long ull; typedef pair<int,int> pii; typedef vector<int> vi;
using ll=long long;
ll n, c[(int)1e5+9], son[(int)1e5+9], cnt[(int)1e5+9], res[(int)1e5+9], ans, ma, sz[(int)1e5+9], dfn_cnt, dfn[(int)1e5+9], ori[(int)1e5+9]; vector<int> g[(int)1e5+9];
void dfs(int u, int fa){ sz[u]=1,dfn[u]=++dfn_cnt,ori[dfn[u]]=u; for(auto it:g[u])if(it!=fa){ dfs(it,u); sz[u]+=sz[it]; son[u]=sz[son[u]]<sz[it]?it:son[u]; } }
void dsu(int u, int fa,int sta){ for(auto it:g[u])if(it!=fa&&it!=son[u]){ dsu(it,u,0); } if(son[u])dsu(son[u],u,1); for(auto it:g[u])if(it!=fa&&it!=son[u]){ for(int i=dfn[it];i<dfn[it]+sz[it];++i){ cnt[c[ori[i]]]+=1; if(cnt[c[ori[i]]] > ma){ ma = cnt[c[ori[i]]], ans=c[ori[i]]; }else if(cnt[c[ori[i]]] == ma){ ans+=c[ori[i]]; } } }
{ cnt[c[u]]+=1; if(cnt[c[u]] > ma){ ma = cnt[c[u]], ans=c[u]; }else if(cnt[c[u]] == ma){ ans+=c[u]; } }
res[u]=ans;
if(!sta){ for(int i=dfn[u];i<sz[u]+dfn[u];++i)cnt[c[ori[i]]]-=1; ma=ans=0; }
}
int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;++i)cin>>c[i]; for(int i=1,x,y;i<n;++i){ cin>>x>>y; g[x].push_back(y),g[y].push_back(x); } dfs(1,0); dsu(1,0,0);
for(int i=1;i<=n;++i)cout<<res[i]<<" \n"[i==n];
return 0; }
|