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
| #include <bits/stdc++.h> using namespace std; typedef long long ll;
const ll N = 1e5 + 10;
ll n, c[N], siz[N], son[N], ans[N], cnt[N], maxn, sum; vector<ll> g[N];
void clear(ll u, ll fa) { cnt[c[u]] = 0; for (ll v : g[u]) { if (v == fa) continue; clear(v, u); } }
void calc(ll u, ll fa, ll s) { cnt[c[u]]++; if (cnt[c[u]] > maxn) { maxn = cnt[c[u]]; sum = c[u]; } else if (cnt[c[u]] == maxn) sum += c[u]; for (ll v : g[u]) { if (v == fa || v == s) continue; calc(v, u, s); } }
void dfs1(ll u, ll fa) { siz[u] = 1; for (ll v : g[u]) { if (v == fa) continue; dfs1(v, u); if (siz[v] > siz[son[u]]) son[u] = v; siz[u] += siz[v]; } }
void dfs2(ll u, ll fa) { for (ll v : g[u]) { if (v == fa || v == son[u]) continue; dfs2(v, u); maxn = sum = 0; clear(v, u); } if (son[u]) dfs2(son[u], u); calc(u, fa, son[u]); ans[u] = sum; }
int main() { scanf("%lld", &n); for (int i = 1; i <= n; i++) scanf("%lld", &c[i]); for (int i = 1; i < n; i++) { ll x, y; scanf("%lld%lld", &x, &y); g[x].push_back(y); g[y].push_back(x); } dfs1(1, 0); dfs2(1, 0); for (int i = 1; i <= n; i++) printf("%lld ", ans[i]); return 0; }
|