这道题分为两部分
求最大联合权值和求和
先想到:如果j,k是i的邻居,那么j,k距离为2,可以算联合权值
那么,最大联合权值是max{maxa[i]*maxb[i]}(1<=i<=n)
maxa,maxb表示最大的两个相邻权值
接下来求和
易知,一个点i,若有邻居的权值为a1,a2,a3,……,at,那么和为a1*(a2+a3+……+at)+a2*(a1+a3+……+at)+……+at*(a1+a2+……+a(t-1))
用代入法,设S=a1+a2+a3+……+at,那么和为S^2-a1^2-a2^2-a3^2-……-at^2
把每个点的S与(a1^2+a2^2+a3^2+……+at^2)存储起来,最终搞一下就好了
Code:
var
maxa,maxb,sum,s,u,v,a:array[0..200000] of int64;
i,n:longint;
print,ans:int64;
begin
readln(n);
for i:=1 to n-1 do
readln(u[i],v[i]);
for i:=1 to n do
read(a[i]);
for i:=1 to n-1 do
begin
if a[u[i]]>maxa[v[i]] then
begin
maxb[v[i]]:=maxa[v[i]];
maxa[v[i]]:=a[u[i]];
end else
if a[u[i]]>maxb[v[i]] then
maxb[v[i]]:=a[u[i]];
if a[v[i]]>maxa[u[i]] then
begin
maxb[u[i]]:=maxa[u[i]];
maxa[u[i]]:=a[v[i]];
end else
if a[v[i]]>maxb[u[i]] then
maxb[u[i]]:=a[v[i]];
sum[u[i]]:=(sum[u[i]]+sqr(a[v[i]])) mod 10007;
sum[v[i]]:=(sum[v[i]]+sqr(a[u[i]])) mod 10007;
s[u[i]]:=(s[u[i]]+a[v[i]]) mod 10007;
s[v[i]]:=(s[v[i]]+a[u[i]]) mod 10007;
end;
for i:=1 to n do
if maxa[i]*maxb[i]>print then
print:=maxa[i]*maxb[i];
write(print,' ');
for i:=1 to n do
ans:=(ans+(sqr(s[i])-sum[i])) mod 10007;
writeln(ans);
end.

395

被折叠的 条评论
为什么被折叠?



