noip2014聯合權值 (貪心 數學推導)

2021-07-24 11:44:38 字數 3153 閱讀 3863

然而我並不知道正解是什麼

然而我也不知道它想考什麼

但是貪心加上瞪眼觀察法這這道題很簡潔、很簡單就ac了=w=

這就叫做簡約高階有內涵=w=

由於距離為2,滿足條件的兩點一定會過乙個中心點(他倆中間隔的那個點),我們把每乙個點看成中心點分別處理,只考慮與它直接相連的點

這樣,題目要求的距離為2,顯然是藍的和藍的之間才能滿足要求

由於根據題目,同兩個點是可以算兩遍的,所以我們這種想法是行得通的

然後我們先來找max

max一定是某乙個點為中心點(紅點)時,它所連的點(藍點)中得最大值*次大值,

那麼我們只需要記錄每個點為中心點的最大值和次大值就可以了,然後取max就是我們的最大聯合權值=w=

那麼和呢?

sum=v1*(σ -v1)+v2*(σ-v2)+v3*(σ-v3)+...+v6*(σ-v6)

所以我們只需要計算出每個i所連的所有點的權值和然後在算的時候用 (sum[i]-v)*v 就可以了

那麼對於n個點,(n-1)條邊,我們只需要列舉邊,

然後分別更新這條邊的左右端點的的max1(最大值)、max2(次大值)和sum 就可以了

然後列舉點,去maxn=max(max1[i]*max2[i])

然後再列舉邊,按照我們上面的公式計算左右端點對權值總和summ的貢獻並加到summ中

pascal實現:

type

rec=record

a,b:longint;

end;

const

mo=10007;

var n,x,y,ans,maxn,summ :longint;

i :longint;

v,sum :array[0..200010] of longint;

l :array[0..200010] of rec;

max1,max2 :array[0..200010] of longint;

begin

read(n);

for i:=1 to n-1 do read(l[i].a,l[i].b);

for i:=1 to n do read(v[i]);

//for i:=1 to n-1 do

begin

sum[l[i].a]:=(v[l[i].b]+sum[l[i].a]) mod mo;

if (v[l[i].b]>max1[l[i].a]) then

begin

max2[l[i].a]:=max1[l[i].a];

max1[l[i].a]:=v[l[i].b];

end else

if (v[l[i].b]>max2[l[i].a]) then max2[l[i].a]:=v[l[i].b];

//sum[l[i].b]:=(v[l[i].a]+sum[l[i].b]) mod mo;

if (v[l[i].a]>max1[l[i].b]) then

begin

max2[l[i].b]:=max1[l[i].b];

max1[l[i].b]:=v[l[i].a];

end else

if (v[l[i].a]>max2[l[i].b]) then max2[l[i].b]:=v[l[i].a];

end;

//for i:=1 to n do

if (max1[i]*max2[i]>maxn) then maxn:=max1[i]*max2[i];

//for i:=1 to n-1 do

begin

summ:=((((sum[l[i].b]-v[l[i].a]+mo) mod mo)*v[l[i].a]) mod mo+summ) mod mo;

summ:=((((sum[l[i].a]+mo-v[l[i].b]) mod mo)*v[l[i].b]) mod mo+summ) mod mo;

end;

writeln(maxn,' ',summ);

end.

c語言實現

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...