联合权值
对考试时的分析:
- (最主要)忘记链式前向星的储存原理了,(其实一开始就不是很懂),导致整个没法实现
- 认清事实后想
(认命)打暴力,然鹅傻fufu地研究(三道题)题意以及被T1那个肥肠简单的模拟拖了时间……emmmm
考后分析题目:
//打了好长的解释都没了 我恨华为
//乘法运算律是关键,不看题解真的写不出来
//重点回忆链式前向星的用法
//输入不太好 但是手机编程太难,先不改了
#include<bits/stdc++.h>
using namespace std;
int n,a,b;
long long sum,maxn,w[300000];
struct Edge
{
int to,next;
}edge[1000000];
int head[300000],cnt;
void add(int a,int b)
{
edge[++cnt].to = b;
edge[cnt].next = head[a];
head[a] = cnt;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n-1;i++){
scanf("%d%d",&a,&b);
add(a,b),add(b,a);
}
for(int i = 1; i <= n; i++) scanf("%lld",&w[i]);
long long he,rmax;//一段的和与一段的最大值
int node;
for(int i=1;i<=n;i++)
{
node=head[i];//第一个元素
he=(rmax=w[edge[node].to])%10007;//得到初始值
node=edge[node].next;//下一个
for(;node!=0;node=edge[node].next)//枚举与之相连的点
{
sum=(sum+he*w[edge[node].to])%10007;//乘法结合律
maxn=max(maxn,rmax*w[edge[node].to]);
he=(he+w[edge[node].to])%10007;
rmax=max(rmax,w[edge[node].to]);
}
}
printf("%lld %lld",maxn,(sum*2)%10007);
return 0;
}