WA求助
查看原帖
WA求助
144797
平面向皮卡丘楼主2020/7/26 18:08
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=100005;
int n,m;
ll cnt[MAXN];
ll siz[MAXN];
int son[MAXN];
vector <int> Map[MAXN];

int col[MAXN];
ll sum[MAXN];
int ans[MAXN];
void init(int x)
{
	siz[x]=1;
	son[x]=-1;
	for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
	{
		int u=*it;
		init(u);
		siz[x]+=siz[u];
		if(son[x]==-1||siz[son[x]]<siz[u]) son[x]=u;
	}
}
void dfs(int x,int v,int rt)
{
	cnt[col[x]]+=v;
	if(v==1)
		if(cnt[col[x]]>cnt[ans[rt]]) ans[rt]=col[x];
	for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
		dfs(*it,v,rt);
}
void DFS(int x,int op)
{
	for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
		if(*it!=son[x]) DFS(*it,1);
	if(son[x]!=-1) DFS(son[x],0);
	
	if(son[x]!=-1) ans[x]=ans[son[x]];
	for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
		if(*it!=son[x]) dfs(*it,1,x);
	cnt[col[x]]++;
	if(cnt[col[x]]>cnt[ans[x]]) ans[x]=col[x];
	for(int i=1;i<=n;i++)
		if(cnt[i]==cnt[ans[x]])
			sum[x]+=i;
	/*
	cout<<"这是"<<x<<"号节点:"<<endl;
	for(int i=0;i<26;i++)
		cout<<cnt[dep[x]][i]<<' ';
	cout<<endl;
	*/
	/*
	for(vector<Q>::iterator it=query[x].begin();it!=query[x].end();it++)
	{
		int tm=(*it).b;
		int tot=0;
		for(int i=0;i<26;i++)
			if(cnt[tm][i]%2==1) tot++;
		if(tot<=1) ans[(*it).diji]=1;
		else ans[(*it).diji]=0;
		
		cout<<"对于第"<<(*it).diji<<"组数据,答案为"<< (tot<=1?1:0)<<x<<' '<<tm<<endl;
		for(int k=0;k<26;k++)
			cout<<cnt[tm][k]<<' ';
		cout<<endl; 
		
	}
	*/
	if(op==1)
	{
		cnt[col[x]]--;
		for(vector <int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
			dfs(*it,-1,x);
	}
}
int main()
{
	scanf("%d",&n); 
	for(int i=1;i<=n;i++)
		scanf("%d",&col[i]);
	for(int i=1;i<=n-1;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		Map[x].push_back(y);
	}
	init(1);
	DFS(1,0);
	for(int i=1;i<=n;i++)
		printf("%lld ",sum[i]);
	return 0;
}

WA……

2020/7/26 18:08
加载中...