为何 MLE on 28
查看原帖
为何 MLE on 28
722313
Whiking楼主2024/2/27 17:21
#include <bits/stdc++.h>
#define ll long long
const int N=1e5+10, M=1<<14, inf=1e9+10;
inline int read() {
    int x=0, f=1;
    char ch=getchar();
    for (; !isdigit(ch); ch=getchar()) if (ch=='-') f=-1;
    for (; isdigit(ch); ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
    return x*=f;
}
using namespace std;
int n, tot, col[N], dfn[N];
ll ans[N];
vector< int> G[N];
struct S {
	map< int, int> cnt;
	vector< int> in;
	ll ans=0; int mx=0;
	void add( int x) {
		if (++cnt[col[x]]>mx) mx=cnt[col[x]], ans=col[x];
		else if (cnt[col[x]]==mx) ans+=col[x];
		in.push_back(x);
	}
	int siz() { return in.size(); }
} Set[N];
void dfs( int u, int fu) {
	dfn[u]=++tot; int msiz=0, son=0;
	for ( auto v:G[u]) {
		if (v==fu) continue ;
		dfs(v, u);
		if (Set[dfn[v]].siz()>msiz) msiz=Set[dfn[u]].siz(), son=v;
	}
	if (!son) return Set[dfn[u]].add(u), ans[u]=Set[dfn[u]].ans, void();
	dfn[u]=dfn[son];
	for ( auto v:G[u]) if (v!=fu&&v!=son) for ( auto x:Set[dfn[v]].in) Set[dfn[u]].add(x);
	Set[dfn[u]].add(u), ans[u]=Set[dfn[u]].ans;
}
signed main() {
	n=read();
	for ( int i=1; i<=n; i++) col[i]=read();
	for ( int i=1, u, v; i<n; i++) u=read(), v=read(), G[u].push_back(v), G[v].push_back(u);
	dfs(1, 0);
	for ( int i=1; i<=n; i++) cout<<ans[i]<<" ";
}

2024/2/27 17:21
加载中...