P1351, 60pts, 求调
#include <bits/stdc++.h>
int main()
{
std::ios::sync_with_stdio(0);
std::cin.tie(nullptr);
int n; std::cin >> n;
std::map<int, std::vector<int>> mp;
for(int i = 1; i < n; ++i)
{
int u, v; std::cin >> u >> v;
mp[u].push_back(v);
mp[v].push_back(u);
}
std::vector<int> W(n+3);
for(int i = 1; i <= n; ++i)
{
std::cin >> W[i];
}
int ans1 = 0, ans2 = 0;
const int MOD = 1e4 + 7;
for(int i = 1; i <= n; ++i)
{
int t1, t2, m1=0, m2=0;
t1=0, t2=0;
for(int j: mp[i])
{
if(W[j] > m1) m2 = m1, m1 = W[j];
else if(W[j] > m2) m2 = W[j];
t1 = (t1 + W[j]) % MOD,
t2 = (t2 + W[j]*W[j]) % MOD;
}
ans1 = std::max(ans1, m1 * m2);
t1 = (1ll * t1 * t1) % MOD;
ans2 = (ans2 + (t1 - t2)) % MOD;
}
std::cout << ans1 << ' ' << ans2;
return 0;
}