擴散(二分答案 並查集)

2021-10-07 21:49:10 字數 1177 閱讀 7069

乙個點每過乙個單位時間就會向四個方向擴散乙個距離,兩個點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 的罪犯被關押在同一監獄,他...