亂搞 noip2014聯合權值

2021-07-05 08:47:12 字數 832 閱讀 8649

題目大意:給你一棵無根樹,每個點有乙個權值wi,每條邊的長度為1,對於任意一對點(u,v),如果他們兩個之間的距離為2,那麼會產生wu*wi的「聯合權值」,求樹上所有聯合權值之和和最大的聯合權值分別為多少,最後結果mod10007輸出。

想當年noip2014,oi才學了三個月,上去拿了60滾粗……如果這題a了就有一等啦qwq

首先隨便找個點作為根節點,讓這棵樹變成一棵有根樹。

然後對於每個點,分別記錄它所有子節點權值的和sum1,以及它每個子節點權值的平方的和sum2,最後記錄子節點中權值最大的兩個子節點記錄下來。

所有聯合權值之和=每個節點的(sum1*sum1-sum2 + 該節點的權值×它父親的父親的權值×2)相加 mod 10007

最大權值=max(每個節點的權值×它父親的父親的權值,最大的兩個子節點的權值相乘)

下面來解釋為什麼這樣做:

聯合權值之和:

設節點x的子節點分別為x1,x2,x3,……,xn,它的子節點的聯合權值為

(x1·x2+x1·x3+x1·x4·……·x1·xn)+(x2·x1+x2·x3+x2·x4·……)·……·(……·xn·xn-1)

這個式子等於(x1+x2+x3……xn)^2 - x1^2 - x2^2 - x3^2 …… xn^2

但是還有爺爺節點與孫子節點的權值,所以要加上,而且由於要算兩遍,所以還要乘2

最大的聯合權值:

只需記錄乙個最大值和次大值就好了,反正不會出現最大的兩個值相乘出現比別的還小的情況……最後還要特別關照下爺爺節點和孫子節點的關係……

於是這道題硬生生被我玩了樹形dp……

這題還有其他好多做法吧,光看看提交中有多少比我快的就知道了……

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