洛谷UKE,CF上提交第6个点MLE了,求解 QWQ:
#include <bits/stdc++.h>
#define ll long long
#define re register
using namespace std;
int n, c[100005], g[100005], st[100005], xt[100005], ans[100005], a[100005], len[100005], tt = 1, maxn, sum;
bool heavyson[100005];
void add(int u, int v)
{
g[++ tt] = v, xt[tt] = st[u], st[u] = tt;
}
void heavy(int x, int y)
{
len[x] = 1;
int m = 0, f = 0;
for (re int i = st[x]; i; i = xt[i])
{
int vis = g[i];
if (vis == y) continue;
heavy(vis, x);
len[x] += len[vis];
if (len[vis] > m)
{
m = len[vis];
f = vis;
}
}
if (f) heavyson[f] = 1;
}
void init(int x, int y)
{
a[c[x]] --;
for (re int i = st[x]; i; i = xt[i])
{
int vis = g[i];
if (vis == y) continue;
init(vis, x);
}
}
void dfs1(int x, int y, int h)
{
a[c[x]] ++;
if (a[c[x]] > maxn)
{
maxn = a[c[x]];
sum = c[x];
}
else if (a[c[x]] == maxn) sum += c[x];
for (re int i = st[x]; i; i = xt[i])
{
int vis = g[i];
if (vis == y || vis == h) continue;
dfs1(vis, x, h);
}
}
void dfs2(int x, int y)
{
int h = 0;
for (re int i = st[x]; i; i = xt[i])
{
int vis = g[i];
if (vis == y) continue;
if (!heavyson[vis])
{
dfs2(vis, x);
init(vis, x);
maxn = 0, sum = 0;
}
else h = vis;
}
if (h) dfs2(h, x);
dfs1(x, y, h);
ans[x] = sum;
}
signed main()
{
cin >> n;
for (re int i = 1; i <= n; i ++)
{
cin >> c[i];
}
for (re int i = 1; i < n; i ++)
{
int u, v;
cin >> u >> v;
add(u, v), add(v, u);
}
heavy(1, 0);
dfs2(1,0);
for (re int i = 1; i <= n; i ++)
{
cout << ans[i] << " ";
}
return 0;
}