UKE了
查看原帖
UKE了
838482
xuweichi楼主2023/7/20 22:54

洛谷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;
}
2023/7/20 22:54
加载中...