最大值未取模,总和每次都取模,且都开了long long,求调
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+10;
struct node
{
int val;
vector<int> ver;
};
node g[MAXN];
int n;
long long sum,maxn;
void search(int indx)
{
queue<int> q;
long long cnt=0,maxn1=0,maxn2=0;
for(int i=0;i<g[indx].ver.size();i++)
{
int next=g[indx].ver[i];
cnt+=g[next].val;
q.push(g[next].val);
if(g[next].val > maxn1)
{
maxn2=maxn1;
maxn1=g[next].val;
}
else if(g[next].val > maxn2)
{
maxn2=g[next].val;
}
}
maxn=max(maxn,maxn1*maxn2);
double all=cnt*cnt;
while(!q.empty())
{
int num=q.front();
q.pop();
all-=num*num;
}
//cout<<indx<<':'<<'('<<maxn1<<','<<maxn2<<") "<<all<<endl;
sum+=(long long)all;
sum%=10007;
}
int main()
{
//freopen("P1351_2.in","r",stdin);
//freopen("P1351_2.ans","w",stdout);
cin>>n;
for(int i=1;i<=n-1;i++)
{
int u,v;
cin>>u>>v;
g[u].ver.push_back(v);
g[v].ver.push_back(u);
}
for(int i=1;i<=n;i++)
{
cin>>g[i].val;
}
/*for(int i=1;i<=n;i++)
{
cout<<i<<'-'<<g[i].val<<':';
for(int j=0;j<g[i].ver.size();j++)
{
cout<<g[i].ver[j]<<' ';
}
cout<<endl;
}*/
for(int i=1;i<=n;i++)
{
search(i);
}
cout<<maxn<<' '<<sum%10007<<endl;
return 0;
}