#include<cstdio>#include<algorithm>#define maxn 200005#define mo 10007#define INF 0x3f3f3f3fusingnamespace std;struct node{int to, next;}e[maxn <<1];int n, tot, head[maxn], key[maxn];voidAddEdge(int u,int v){
e[++tot]=(node){v, head[u]}; head[u]= tot;
e[++tot]=(node){u, head[v]}; head[v]= tot;}intmain(){scanf("%d",&n);for(int x, y, i =1; i < n; i++){scanf("%d%d",&x,&y);AddEdge(x, y);}for(int i =1; i <= n; i++)scanf("%d",&key[i]);longlong sum =0;int maxkey =-INF;for(int i =1; i <= n; i++){for(int u = head[i]; u; u = e[u].next){for(int v = e[u].next; v; v = e[v].next){
sum =(sum + key[e[u].to]* key[e[v].to])% mo;
maxkey =max(maxkey, key[e[u].to]* key[e[v].to]);}}}printf("%d %lld\n", maxkey, sum *2% mo);return0;}
100分代碼
#include<cstdio>#include<algorithm>#define maxn 200005#define mo 10007#define INF 0x3f3f3f3fusingnamespace std;struct node{int to, next;}e[maxn <<1];int n, tot, head[maxn], key[maxn];voidAddEdge(int u,int v){
e[++tot]=(node){v, head[u]}; head[u]= tot;
e[++tot]=(node){u, head[v]}; head[v]= tot;}intmain(){scanf("%d",&n);for(int x, y, i =1; i < n; i++){scanf("%d%d",&x,&y);AddEdge(x, y);}for(int i =1; i <= n; i++)scanf("%d",&key[i]);/*long long sum = 0; int maxkey = -INF; Getting sum/max for 70 points
for (int i = 1; i <= n; i++){
for (int u = head[i]; u; u = e[u].next){
for (int v = e[u].next; v; v = e[v].next){
sum = (sum + key[e[u].to] * key[e[v].to]) % mo;
maxkey = max(maxkey, key[e[u].to] * key[e[v].to]);
}
}
}*/longlong certain_sum, sum =0;int maxkey =-INF;for(int i =1; i <= n; i++){
certain_sum =0;int tmp1 =0, tmp2 =0;for(int u = head[i]; u; u = e[u].next){
certain_sum += key[e[u].to];if(key[e[u].to]> tmp1) tmp2 = tmp1, tmp1 = key[e[u].to];elseif(key[e[u].to]> tmp2) tmp2 = key[e[u].to];}
maxkey =max(maxkey, tmp1 * tmp2);for(int u = head[i]; u; u = e[u].next){
sum =(sum + key[e[u].to]*(certain_sum - key[e[u].to]))% mo;}}printf("%d %lld\n", maxkey, sum % mo);return0;}//https://www.luogu.org/problemnew/show/P1351