乙個點每過乙個單位時間就會向四個方向擴散乙個距離,兩個點a、b連通,記作e(a,b),當且僅當a、b的擴散區域有公共部分。連通塊的定義是塊內的任意兩個點u、v都必定存在路徑e(u,a0),e(a0,a1),…,e(ak,v)。給定平面上的n給點,問最早什麼時刻它們形成乙個連通塊。
我們可以二分答案,然後對於每個時間,判斷每個點之間的曼哈頓距離是否小於時間的兩倍(因為兩個點是一起擴散的)。
#include
#define x first
#define y second
#define ios ios::sync_with_stdio(false);cin.tie(0);
using
namespace std;
typedef
unsigned
long
long ull;
typedef pair<
int,
int> pii;
typedef pair<
long
,long
> pll;
typedef pair<
char
,char
> pcc;
typedef
long
long ll;
const
int n=55;
const
int m=
150;
const
int inf=
0x3f3f3f3f
;const
int mod=
998244353
;int x[n]
,y[n]
,p[n]
,n;void
init
(int n)
}int
find
(int x)
bool
check
(int time)}}
int cnt=0;
for(
int i=
0;i(p[find
(i)]
==i) cnt++
;return cnt==1;
}void
solve()
cout<}int
main()
P1661 擴散 二分答案 並查集
乙個點每過乙個單位時間就會向四個方向擴散乙個距離,如圖。兩個點a b連通,記作e a,b 當且僅當a b的擴散區域有公共部分。連通塊的定義是塊內的任意兩個點u v都必定存在路徑e u,a0 e a0,a1 e ak,v 給定平面上的n給點,問最早什麼時刻它們形成乙個連通塊。輸入格式 第一行乙個數n,...
洛谷P1661擴散 二分 並查集
首先我們先二分答案,然後用並查集記錄有多少個聯通塊。如果兩個聯通塊成為乙個聯通塊,則他們的哈密頓距離小於擴散時間的一半。因此可以二分答案,檢查是否等於乙個聯通塊就行了。include include include include using namespace std typedef long l...
關押罪犯 並查集 二分
s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...