我們要做的是計算距離為2的有序對權值之和及最大值,最大值好弄,但一一枚舉是不可行的,因為n<=200000,我們可以預處理一下,每次讀入邊的時候我們把與當前頂點有邊相連的所有點的權值中的最大值及次大值儲存起來,然後用個o(n)時間就可以計算出來。至於權值和,我們可以這樣,用s[i]儲存與節點i相連的節點的權值和,列舉每條邊(u,v),sigma((s[u]-w[v])*w[v]+(s[v]-w[u])*w[u])mod 1007 即是答案。
typeedge=record
u,v:longint;
end;
var n,i,j,ans1,ans2,u,v:longint;
s:array[1..200000]of int64;
w,max1,max2:array[1..200000]of longint;
e:array[1..200000]of edge;
procedure work(x:longint;var a,b:longint);
begin
if x>a then
begin
b:=a; a:=x;
endelse
if x>b then b:=x;
end;
begin
readln(n);
for i:=1 to n-1 do readln(e[i].u,e[i].v);
for i:=1 to n do read(w[i]);
for i:=1 to n-1 do
begin
u:=e[i].u; v:=e[i].v;
inc(s[u],w[v]);
inc(s[v],w[u]);
work(w[v],max1[u],max2[u]);
work(w[u],max1[v],max2[v]);
end;
for i:=1 to n do if max1[i]*max2[i]>ans1 then ans1:=max1[i]*max2[i];
for i:=1 to n-1 do
begin
u:=e[i].u; v:=e[i].v;
ans2:=(ans2+(s[u]-w[v])*w[v] mod 10007)mod 10007;
ans2:=(ans2+(s[v]-w[u])*w[u] mod 10007)mod 10007;
end;
writeln(ans1,' ',ans2);
end.
NOIP2014 聯合權值
鄰接表儲存樹。列舉每個節點,使之作為中點,先計算出與其相連的所有節點的權值總和l,與其相連的所有節點在該節點處形成的權值 l w w。如果沒有l,直接列舉以此節點為中點的節點對則只能過60 的資料。include include include include include include inc...
NOIP 2014 聯合權值
評測傳送 70分 列舉中間點,然後再兩層迴圈列舉這個點的所有鄰接點,兩兩相乘,加入和中。可能退化為n 2 100分 在70分的基礎上加乙個優化,當我們列舉了中間點,然後再列舉它的鄰接點 j 時,用sum i 表示 i 的所有鄰接點的權值的和,那麼以 i 作為中間點,j這個點對答案的貢獻為 sum i...
(noip2014)聯合權值
題目傳送門sxazr 本題可直接列舉每個點,然後列舉與它相連的兩個點,這兩個點的乘積便是乙個聯合權值 可以記錄下每個點與它相連的點的最大值和次大值,結果就是取最大值和次大值乘積的最大 求和的話,可以記錄下乙個點相連所有點的和s i sum w j s i w j j是與i相連的點 列舉每個點的sum...