题目
在一棵树中找出无序点对(a,b)(a,b)(a,b),使aaa和bbb的距离为2,问∑wa×wbmod  10007\sum w_a\times w_b\mod10007∑wa×wbmod10007以及max(w[a]×w[b])max(w[a]\times w[b])max(w[a]×w[b])
分析
一棵树上两点路径只有一条,所以说符合要求的其中一个点对都必然与一个点相连,所以可以枚举中间点,求出答案
代码
#include <cstdio>
#define rr register
using namespace std;
struct node{int y,next;}e[400001];
int n,ls[200001],w[200001],k=1;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (c<48||c>57) c=getchar();
while (c>47&&c<58) ans=(ans<<3)+(ans<<1)+c-48,c=getchar();
return ans;
}
inline void add(int x,int y){
e[++k]=(node){y,ls[x]}; ls[x]=k;
e[++k]=(node){x,ls[y]}; ls[y]=k;
}
signed main(){
n=iut(); long long ans=0,ans1=0;
for (rr int i=1;i<n;++i) add(iut(),iut());
for (rr int i=1;i<=n;++i) w[i]=iut();
for (rr int i=1;i<=n;++i){
rr int maxx=w[e[ls[i]].y],sum=w[e[ls[i]].y];
for (rr int j=e[ls[i]].next;j;j=e[j].next){
ans=(ans+1ll*sum*w[e[j].y])%10007; sum+=w[e[j].y];
ans1=ans1>(1ll*maxx*w[e[j].y])?ans1:(1ll*maxx*w[e[j].y]);
maxx=maxx>w[e[j].y]?maxx:w[e[j].y];
}
}
printf("%lld %lld",ans1,ans*2%10007);
return 0;
}