暴力
找中點
累加
int n,f[200010],ansmax,ans;
vector<int>t[200010];
int main(){
n=read();
fr(i,1,n-1)
{
int u=read(),v=read();
t[u].push_back(v);
t[v].push_back(u);
}
fr(i,1,n)
f[i]=read();
fr(i,1,n)
{
int max1=0,max2=0,sum=0;
fr(j,0,t[i].size()-1)
{
int k=f[t[i][j]];
sum=(sum+k)%mod;
if(k>max1)
{
max2=max1;
max1=k;
}
else
if(k>max2)
max2=k;
}
ansmax=max(ansmax,max1*max2);
fr(j,0,t[i].size()-1)
{
int k=f[t[i][j]];
ans=(ans+(k*(sum-k+mod))%mod)%mod;
}
}
printf("%d %d\n",ansmax,ans);
rt 0;
}