记录编号 449460 评测结果 AAAAAAAAAA
题目名称 [NOIP 2014]联合权值 最终得分 100
用户昵称 Gravatarswttc 是否通过 通过
代码语言 C++ 运行时间 0.332 s
提交时间 2017-09-14 14:43:54 内存使用 8.71 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>

using namespace std;

const long long MOD=10007;
long long n,mx1[200010],mx2[200010],sum[200010],w[200010],ans1=-1e9,ans2=0;
vector<int>e[200010];

void dfs(int cur,int fa)
{
	for(int i=0;i<e[cur].size();i++){
		sum[cur]+=w[e[cur][i]];
		sum[cur]%=MOD;
		if(mx1[cur]<=w[e[cur][i]]){
			mx2[cur]=mx1[cur];
			mx1[cur]=w[e[cur][i]];
		}
		else{
			mx2[cur]=max(mx2[cur],w[e[cur][i]]);
		}
	}
	if(e[cur].size()>=2) ans1=max(ans1,mx1[cur]*mx2[cur]);
	for(int i=0;i<e[cur].size();i++){
		ans2+=(w[e[cur][i]]*(((sum[cur]-w[e[cur][i]]))+MOD)%MOD);
		ans2%=MOD;
	}
	for(int i=0;i<e[cur].size();i++){
		if(e[cur][i]==fa) continue;
		dfs(e[cur][i],cur);
	}
	return;
}

int main()
{
	freopen("linkb.in","r",stdin);
	freopen("linkb.out","w",stdout);
	scanf("%lld",&n);	
	for(int i=1;i<n;i++){
		int a,b;
		scanf("%lld%lld",&a,&b);
		e[a].push_back(b);
		e[b].push_back(a);
	}
	for(int i=1;i<=n;i++) scanf("%lld",&w[i]);
	dfs(1,0);
	printf("%lld %lld",ans1,ans2%MOD);
	return 0;
}