P1661 擴散 二分答案 並查集

2022-05-01 15:42:08 字數 989 閱讀 4066

乙個點每過乙個單位時間就會向四個方向擴散乙個距離,如圖。

兩個點a、b連通,記作e(a,b),當且僅當a、b的擴散區域有公共部分。連通塊的定義是塊內的任意兩個點u、v都必定存在路徑e(u,a0),e(a0,a1),…,e(ak,v)。給定平面上的n給點,問最早什麼時刻它們形成乙個連通塊。

輸入格式:

第一行乙個數n,以下n行,每行乙個點座標。

【資料規模】

對於20%的資料,滿足1≤n≤5; 1≤x[i],y[i]≤50;

對於100%的資料,滿足1≤n≤50; 1≤x[i],y[i]≤10^9。

輸出格式:

乙個數,表示最早的時刻所有點形成連通塊。

輸入樣例#1: 複製

2

0 05 5

輸出樣例#1: 複製

5

二分答案且曼哈頓距離<=mid*2

#include#include

#include

using

namespace

std;

int xs[51

];int ys[51];//

座標int ints[51];//

並查集int find(int

n)int

main()

//初始化並查集

for(register int i=0;i)}}

int cnt=0;//

連通塊個數

for(register int i=0;i)

if(cnt==1)//

只有乙個連通塊就更新答案向下查詢

else

}cout

return(0

);}

view code

洛谷P1661擴散 二分 並查集

首先我們先二分答案,然後用並查集記錄有多少個聯通塊。如果兩個聯通塊成為乙個聯通塊,則他們的哈密頓距離小於擴散時間的一半。因此可以二分答案,檢查是否等於乙個聯通塊就行了。include include include include using namespace std typedef long l...

擴散(二分答案 並查集)

乙個點每過乙個單位時間就會向四個方向擴散乙個距離,兩個點a b連通,記作e a,b 當且僅當a b的擴散區域有公共部分。連通塊的定義是塊內的任意兩個點u v都必定存在路徑e u,a0 e a0,a1 e ak,v 給定平面上的n給點,問最早什麼時刻它們形成乙個連通塊。我們可以二分答案,然後對於每個時...

關押罪犯 並查集 二分

s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...