NOIP2014 聯合取值

2021-08-10 13:25:03 字數 2144 閱讀 7738

無向連通圖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 3
3 4
4 5
1 5 2 3 10
輸出樣例

#1:

20 74
本例輸入的圖如上所示,距離為

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。

一開始來個暴力優化期盼能過結果就多了10分70……

距離為2,也就是每次都會有個轉接點,於是我們就列舉這個轉接點。對於每個轉接點,有兩個點ab想接的話,就是2ab,三個點的話就是2ab,2ac,2bc。但是我們發現直接硬搞有些麻煩。所以我們來轉化一下,2ab=(a+b)^2-(a^2+b^2),2ab+2ac+2ac=(a+b)^2+2c(a+b)^2+c^2-(a^2+b^2+c^2)=(a+b+c)^2-(a^2+b^2+c^2)。就ac了

#include#include#include#define n  405000

#define p 10007

using namespace std;

int head[n],next[n],to[n],a[n];

int tot=0,n;

long long ans,maxx;

void add_edge(int x,int y)

int main()

if (max1*max2 > maxx) maxx=max1*max2;

ans=(ans+sum2*sum2-sum1)%p;

}printf("%lld %lld\n",maxx,ans);

return 0;

}

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