NOIP 2014 聯合權值

2022-05-28 03:39:11 字數 2339 閱讀 4728

無向連通圖g 有n 個點,n - 1 條邊。點從1 到n 依次編號,編號為 i 的點的權值為w i ,每條邊的長度均為1 。圖上兩點( u , v ) 的距離定義為u 點到v 點的最短距離。對於圖g 上的點對( u, v) ,若它們的距離為2 ,則它們之間會產生wu×wv 的聯合權值。

請問圖g 上所有可產生聯合權值的有序點對中,聯合權值最大的是多少?所有聯合權值之和是多少?

輸入格式:

輸入檔名為link .in。

第一行包含1 個整數n 。

接下來n - 1 行,每行包含 2 個用空格隔開的正整數u 、v ,表示編號為 u 和編號為v 的點之間有邊相連。

最後1 行,包含 n 個正整數,每兩個正整數之間用乙個空格隔開,其中第 i 個整數表示圖g 上編號為i 的點的權值為w i 。

輸出格式:

輸出檔名為link .out 。

輸出共1 行,包含2 個整數,之間用乙個空格隔開,依次為圖g 上聯合權值的最大值

和所有聯合權值之和。由於所有聯合權值之和可能很大,輸出它時要對10007 取餘。

輸入樣例#1: 複製

5  

1 2

2 33 4

4 5

1 5 2 3 10

輸出樣例#1: 複製

本例輸入的圖如上所示,距離為2 的有序點對有( 1,3) 、( 2,4) 、( 3,1) 、( 3,5) 、( 4,2) 、( 5,3) 。

其聯合權值分別為2 、15、2 、20、15、20。其中最大的是20,總和為74。

【資料說明】

對於30% 的資料,1 < n≤ 100 ;

對於60% 的資料,1 < n≤ 2000;

對於100%的資料,1 < n≤ 200 , 000 ,0 < wi≤ 10, 000 。

這個題以亂搞為主。

我們可以發現直接列舉乙個點兩邊的點就相當於同時列舉兩點了,所以我們直接列舉乙個點兩邊的點。考慮這樣複雜度還是太高(n^2),我們嘗試優化。

首先,對於乙個點的最大的聯合權值,一定是其所有出點權值中最大和次大的乘積(如果只有乙個,則次大不存在,聯合權值為0),我們可以在列舉點的時候順便處理出最大和次大值來。其次,對於乙個點的聯合權值之和,為σw[i]*w[j],(i,j為點u的出點,且i,j有序),我們從這個式子中不難發現,乙個出點i可以和點u的任意乙個出點j(i≠j)產生一定的聯合權值,總的來說就是i對答案的貢獻為w[i]*(w[j1]+w[j2]+...+w[jd])(在這個式子中不含w[i]),(d為u的出度),如果令sum表示u的所有出點的權值之和,那麼i對答案的貢獻也可以寫成w[i]*(sum-w[i]),那麼,我們可以預處理出sum來,然後對出點進行一次遍歷,計算出所有的w[i]*(sum-w[i]),則σw[i]*(sum-w[i]),就是點u對答案的貢獻。最後相加即可。

這題的難點就在於開腦洞,和各種數學知識亂搞就行了。

#include#include

#include

#include

#include

#include

using

namespace

std;

const

int n=2e5+5

;inline

intread()

while(c>='

0'&&c<='9'

)

return ret*f;

}int

n;struct

edgee[n

<<1

];int head[n],nxt[n<<1],tot=0

;void adde(int f,intt);

nxt[tot]=head[f];

head[f]=tot;

}int

w[n];

int maxw=0,sumw=0

;const

int mod=10007

;void

solve()

else

sum+=w[v];

sum%=mod;

}maxw=max(maxw,fir*sec);

for(int j=head[i];j;j=nxt[j])

}}int

main()

for(int i=1;i<=n;i++) w[i]=read();

solve();

printf(

"%d %d

",maxw,sumw%mod);

return0;

}

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