JZOI 4311 統一天下

2022-02-13 07:23:32 字數 2600 閱讀 1387

洛谷ac通道!

題目描述:

從前有兩個國家$w_1$, $w_2$。國家$w_i$($i∈ \)$有$n_i$座城市,這$n_i$座城市由$n_i-1$條雙向道路相連。任意乙個國家的內部都是連通的。乙個國家的兩個點之間存在唯一的最短路,兩個點的距離是這條最短路上邊的數目。(也可以理解為道路的長度均為$1$。) 注意$w_1$和$w_2$並不聯通。

有一天,$w_1$的軍隊在小h的帶領下一舉攻破了$w_2$,建立了大一統的政權$w$。為了使全國連通,小h決定在$w_1$的某個點和$w_2$的某個點之間新修建一條路,使得$n=n_1+n_2$個點兩兩組成的$\dfrac$個點對的距離和最小。

小h請你幫幫他,算一下這個最小距離。

題解:

首先,官方題解有大大的鍋!!!  他給的式子居然是錯的!!

吐槽完了,進入正題。

不妨將兩個國家分開來看。設$dp_$表示乙個圖中,所有的點到$i$點的距離和,$g_1$為乙個圖中所有的點的相互間距離的和。

那麼,我們要求的柿子就是:

$dp_ * n_2 + dp_ * n_1 + n_1 * n_2 + g_1 + g_2$

其中,$dp_ * n_2$表示一張圖的所有點連向另一張圖的每個點的距離和。注意到連線後會新加入一條邊,所以加上$n_1 * n_2$,即該邊會被經過這麼多次。

最後$g_1$和$g_2$即為在兩邊的原圖中內部配對。

考慮如何求$dp_$:    一遍$dfs$,我們可以直接求出$dp$, 然後有遞推柿:

$dp_ = dp + n - siz_ * 2$  其中,$siz_$代表兒子的子樹大小(包括自己)。

對於$g_1$, 直接將所有的$dp_$相加然後除以$2$即可。

最後考慮如何求答案: 不難發現,$i, j$的貢獻是分開的,沒有聯絡、所以找到最小的$dp_$ 和最小的$dp_$,然後算出上面的柿子即可。

#include using

namespace

std;

#define int long long

const

int n = (int)6e5 + 10

;template

inline

void read(t&a)

while

(isdigit(c))

a = x *s;

return;}

struct

node

} t[n

<< 1

];int

f[n];

int bian = 0

;inline

void add(int u, int

v)int

n1, n2;

intdp[n];

intsiz[n], dis[n];

int g[2

];int

tot;

#define v t[i].v

void dfs(int now, int

father)

}return;}

void dfs2(int now, int father, int

n) }

return;}

#undef vsigned main()

for(int i = 1; i < n2; i++)

dfs(

1, 0

); dp[

1] =tot;

tot = 0

; dfs(

1 + n1, 0

); dp[n1 + 1] =tot;

dfs2(

1, 0

, n1);

dfs2(n1 + 1, 0

, n2);

int tot1 = 0, tot2 = 0

;

int minn1 = (int)1e18, minn2 = (int

)1e18;

for(int i = 1 ; i <= n1; i++)

tot1 += dp[i], minn1 =min(minn1, dp[i]);

for(int i = n1 + 1;i <= n1 + n2; i++)

tot2 += dp[i], minn2 =min(minn2, dp[i]);

g[0] = tot1 / 2, g[1] = tot2 / 2

;

int ans = minn1 * n2 + minn2 * n1 + n1 * n2 + g[0] + g[1

]; cout

<< ans

}

心情 一天又一天

之前寫的東西都放在了自己的日記裡,今天想在隨筆裡寫一些。一路跌跌撞撞的走到了研二。說來也是很難了,剛上研一投了一篇 國內研究此方向的少之又少,等了三個月,編輯終於給了回覆,審稿人實在難找,給了大修,沒想到這一修來來回回修了三次,弄了五個審稿人,改了無數內容,加了無數實驗,終於在10個月之後中了。此時...

java 日期加一天減一天

date current new date calendar calendar calendar.getinstance calendar.settime current calendar.set calendar.hour,0 小時設定為0 calendar.set calendar.minute...

09的最後一天,愚蠢的一天

今天是2009年的最後一天,也算是辭舊迎新的日子,可惜,今天的我卻表現得相當之愚蠢.也罷,反思一下這愚蠢的一天並把它遠遠得拋開,然後去迎接嶄新的一天,嶄新的一年吧 話說,sap專案組以迅雷不及掩耳盜鈴之式在我的工作計畫中插了幾單,全是優先順序為aaaa級的,其中之一就是讓我今天變得如此愚蠢的報表.於...