记录编号 292247 评测结果 AAAAAAAAAA
题目名称 [NOIP 2014]联合权值 最终得分 100
用户昵称 Gravatar小e 是否通过 通过
代码语言 C++ 运行时间 0.114 s
提交时间 2016-08-08 17:28:36 内存使用 4.30 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
using namespace std;

int value[210000];
int Max[210000], sum[210000];
int from[210000], to[210000];
//max[i]: 与i相邻的权值最大的点的权值, sum[i]: 与i相邻的所有点的权值和 
const int mod = 10007;
int maxn, ans;

inline int GetMax(const int& a, const int& b)
{
	if(a > b)	return a;
	return b;
}

inline int Read()
{
	int a = 0;
	char ch = getchar();
	while(ch < '0' || ch > '9')	ch = getchar();
	while(ch >= '0' && ch <='9'){
		a = a*10 + ch-'0';
		ch = getchar();
	}
	return a;
}

int main()
{
	freopen("linkb.in", "r", stdin); freopen("linkb.out", "w", stdout);
	int n = Read();
	for(int i = 1; i < n; i++)	from[i] = Read(), to[i] = Read();
	for(int i = 1; i <= n; i++)	value[i] = Read();
	for(int i = 1; i < n; i++){
//		printf("max[%d] %d\n", from[i], Max[from[i]]);
		maxn = GetMax(maxn, Max[from[i]]*value[to[i]]);
		Max[from[i]] = GetMax(Max[from[i]], value[to[i]]);
		maxn = GetMax(maxn, Max[to[i]]*value[from[i]]);
		Max[to[i]] = GetMax(Max[to[i]], value[from[i]]);
		sum[to[i]] += value[from[i]]; sum[to[i]] %= mod;
		sum[from[i]] += value[to[i]]; sum[from[i]] %= mod;
	}
	for(int i = 1; i < n; i++){
		ans += (sum[from[i]]-value[to[i]]) * value[to[i]];
		ans += (sum[to[i]]-value[from[i]]) * value[from[i]];
		ans %= mod;
	}
//	for(int i = 1; i <= n; i++)	printf("max[%d] %d\n", i, Max[i]);
	printf("%d %d", maxn, ans);
	fclose(stdin); fclose(stdout);
	return 0;
}
/*
5
1 2
2 3
3 4
4 5
1 5 2 3 10
*/
/*
7
1 2 
2 3
1 6
1 5
6 7
2 4
1 1 1 1 1 1 1
*/
/*
20
1 2
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 2
11 1
1 12
1 13
1 14
14 15
16 14
14 17
14 18
19 14
20 15
4 6 5 9 2 4 9 1 9 4 2 5 4 3 6 6 10 5 8 2

ans: 81 4390
*/