dus on tree WA on #3 求助!
查看原帖
dus on tree WA on #3 求助!
560516
喵仔牛奶楼主2023/1/9 18:01

https://codeforces.com/contest/600/submission/188568254

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct edge {
	int to, next;
} e[N];
long long n, u, v, edge_cnt, cnt, now, qwq, c[N], ans[N], head[N], siz[N], ap[N], fa[N], son[N];
void dfs1(int u, int fat) {
	fa[u] = fat, siz[u] = 1;
	for (int i = head[u]; i; i = e[i].next) {
		int v = e[i].to;
		if (v == fa[u]) continue;
		dfs1(v, u), siz[u] += siz[v];
		if (siz[v] > siz[son[u]]) son[u] = v;
	}
}
void insert(int u) {
	if (++ ap[c[u]] == qwq) now += c[u];
	if (ap[c[u]] > qwq) now = c[u], qwq = ap[c[u]];
}
void clean(int u) {
	qwq = now = 0, ap[c[u]] --;
	for (int i = head[u]; i; i = e[i].next)
		if (e[i].to != fa[u]) clean(e[i].to);
}
void addtree(int u) {
	insert(u);
	for (int i = head[u]; i; i = e[i].next)
		if (e[i].to != fa[u]) addtree(e[i].to);
}
void dfs2(int u) {
	for (int i = head[u]; i; i = e[i].next)
		if (e[i].to != fa[u] && e[i].to != son[u]) dfs2(e[i].to), clean(e[i].to);
	if (son[u]) dfs2(son[u]);
	for (int i = head[u]; i; i = e[i].next)
		if (e[i].to != fa[u] && e[i].to != son[u]) addtree(e[i].to); 
	insert(u), ans[u] = now;
}
void add(int u, int v) {
	e[++ edge_cnt].to = v;
	e[edge_cnt].next = head[u];
	head[u] = edge_cnt;
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; i ++)
		cin >> c[i];
	for (int i = 1; i < n; i ++)
		cin >> u >> v, add(u, v);
	dfs1(1, 0), dfs2(1);
	for (int i = 1; i <= n; i ++)
		cout << ans[i] << ' ';
	cout << '\n';
	return 0;
}

2023/1/9 18:01
加载中...