题意:算出树上长度为2的权值和最大权值
分析:
长度为2的路径可以把它标识为经过某一点,那么统计和计算就简单多了,直接枚举点,然后该点的儿子就俩俩组成长度为2的路径。
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define MP make_pair
#define lson root<<1,l,midd
#define rson root<<1|1,midd+1,r
typedef long long ll;
const int mod=10007;
const int M=2e5+5;
const int inf=0x3f3f3f3f;
const ll INF=1e18;
vector<int>g[M];
int a[M];
int main(){
int n;
scanf("%d",&n);
for(int u,v,i=1;i<n;i++){
scanf("%d%d",&u,&v);
g[u].pb(v),g[v].pb(u);
}
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int maxx=0,sum=0;
for(int i=1;i<=n;i++){
int nowsum=0,nowmax=0;
for(auto v:g[i]){
sum+=nowsum*a[v],sum%=mod;
nowsum+=a[v],nowsum%=mod;
maxx=max(maxx,nowmax*a[v]);
nowmax=max(nowmax,a[v]);
}
}
printf("%d %lld\n",maxx,2ll*sum);
return 0;
}

京公网安备 11010502036488号