注意,如果你是统计无须数对和,在最后乘二,千万别忘记再次取模。
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define lson (p << 1)
#define rson ((p << 1) | 1)
#define mid ((l + r) >> 1)
const int MAXN = 2e6 + 5, mod = 10007;
vector<int> G[MAXN];
int n, w[MAXN], s = 0, mx = -0x7f7f7f7f;
void dfs(int x, int fa, int fa2) {
s = (s + w[x] * w[fa2]) % mod;
mx = max(mx, w[x] * w[fa2]);
// cout << x << ' ' << fa << ' ' << fa2 << ' ' << s << endl;
int sum = 0, lsmax = 0;
for (auto u:G[x]) {
if (u == fa) continue;
dfs(u, x, fa);
s = (s + w[u] * sum) % mod;
mx = max(mx, w[u] * lsmax);
sum = sum + w[u];
lsmax = max(lsmax, w[u]);
}
}
signed main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int i = 1; i < n; ++i) {
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1; i <= n; ++i) cin >> w[i];
dfs(1, 0, 0);
cout << mx << ' ' << s * 2 % mod << endl; // 这里
return 0;
}