记录编号 203756 评测结果 AAAAAAAAAA
题目名称 [NOIP 2014]联合权值 最终得分 100
用户昵称 Gravatarsxysxy 是否通过 通过
代码语言 C++ 运行时间 0.446 s
提交时间 2015-11-03 16:21:19 内存使用 4.13 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#define MOD (10007)
using namespace std;

int w[200002];
long long r = 0;
long long m = -1;

class node
{
public:	
	vector<int>adj;
	int v;
	void add_way_to(int o)
	{
	//	v = 0;
		this->adj.push_back(o);
	}
};

node ns[200002];

int main()
{
	freopen("linkb.in", "r", stdin);
	freopen("linkb.out", "w", stdout);
	int n;
	int i,j,k;
	int u,v;
	int p,q;
	long long s;
	
	scanf("%d", &n);
	for(i = 1; i <= n-1; i++)
	{
		scanf("%d %d", &u, &v);
		ns[u].add_way_to(v);
		ns[v].add_way_to(u);
	}
	for(i = 1; i <= n; i++)
	{
		cin >> v;
		ns[i].v= v;
	}
	vector<int>ll;
	for(i = 1; i <= n; i++) //枚举所有节点 
	{
		s = 0;
		ll.clear();
		if(ns[i].adj.size() == 1)continue;
		for(p = 0; p < ns[i].adj.size(); p++) //枚举当前节点的后继 
		{
			q = ns[i].adj[p];
		
			s += ns[q].v;
			ll.push_back(ns[q].v);
		}	
		sort(ll.begin(), ll.end());
		k = ll.size();
		u = s;
		for(p = 0; p < ns[i].adj.size(); p++)
		{
			s = u;
			q = ns[i].adj[p];
			s -= ns[q].v;
			s *= ns[q].v;
			r += s%MOD;
			r %= MOD;
			if(k > 1)
			{
				m = max(m, (long long)ll[k-1]*ll[k-2]);
			}
		}
	}
	cout << m << ' ' << r << endl;
	return 0;
}
	//s = 0;
			//for(u = 0; u < ns[q].adj.size(); u++) //枚举当前节点的后继的后继 
			//{
			//	v = ns[q].adj[u];
			//	if(v == i)continue;    //但是如果当前节点的后继的后继就是当前节点的话。。。
			//	if(v < i)continue;     //但是如果之前这两个节点已经计算过了。。。 
			//		s += ns[v].v;
			//	m = max(m,ns[i].v*ns[v].v);
			//}
			//r += ns[i].v * s;
			//r %= MOD;