求调qwq
查看原帖
求调qwq
910357
songzhihan2010楼主2024/7/15 19:48
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
ll n;
ll u,v,maxn,sum;
vector<ll> e[100010];
ll son[100010],size[100010];
ll c[100010],ans[100010];
ll ap[100010];
void dfs(ll t,ll fa){
	size[t]=1;
	for (int i=1;i<e[t].size();i++){
		if(e[t][i]==fa) continue;
		dfs(e[t][i],t);
		if(size[son[t]]<size[e[t][i]]){
			son[t]=e[t][i];
		}
	}
}
void init(ll t,ll fa){
	ap[c[t]]--;
	for (int i=0;i<e[t].size();i++){
		if(e[t][i]!=fa){
			init(e[t][i],t);
		}
	}
}
void DFS(ll t,ll fa){
	ap[c[t]]++;
	if(ap[c[t]]>maxn){
		maxn=ap[c[t]];
		sum=c[t];
	} else if(ap[c[t]]==maxn){
		sum+=c[t];
	}
	for (int i=0;i<e[t].size();i++){
		if(e[t][i]==son[t]||e[t][i]==fa) continue;
		DFS(e[t][i],t);
	}
} 
void dfs1(ll t,ll f){
	for (int i=0;i<e[t].size();i++){
		if(e[t][i]==f||e[t][i]==son[t]) continue;
		dfs1(e[t][i],t);
		init(e[t][i],t);
		sum=0;
		maxn=0;
	}
	if(son[t])dfs1(son[t],t);
	DFS(t,f);
	ans[t]=sum;
}
signed main(){
	n=read();
	for (int i=1;i<=n;i++){
		c[i]=read();
	}
	for (int i=1;i<n;i++){
		u=read();
		v=read();
		e[u].push_back(v);
		e[v].push_back(u);
	}
	dfs(1,0);
	dfs1(1,0);
	for (int i=1;i<=n;i++){
		printf("%lld ",ans[i]);
	}
} 

样例二没过

2024/7/15 19:48
加载中...