hihoCoder 穿越禁區(並查集)

2021-08-02 11:06:15 字數 1828 閱讀 3700

時間限制:

10000ms

單點時限:

1000ms

記憶體限制:

256mb

作為h國的精英**,你接到了一項任務,駕駛一輛吉普穿越布滿監測雷達的禁區。為了簡化題目,我們可以把禁區想象為乙個左下角是(0, 0)右上角是( w, h )的長方形區域。區域中一共有 n 座雷達,其中第 i 座的座標是(xi

, yi

),監測範圍是半徑為 ri

的圓形區域。所有在圓內和圓上的運載工具都會被監測到。

你的目標是從左到右穿越禁區。你可以選擇線段(0, 0)-(0, h)上任意一點作為起點,線段(w, 0)-(w, h)上任意一點作為終點。在禁區內你可以沿任意路線行駛,只要保持始終在禁區內並且沒有被雷達監測到。

給出禁區內的雷達部署方案,你需要判斷是否存在滿足條件的行駛路線。

輸入包含多組資料。

第1行是乙個整數 t,表示以下有 t 組資料 (1 ≤ t ≤ 10)。

每組資料的第1行:三個整數 w, h, n (0 ≤ w, h ≤ 1000000, 1 ≤ n ≤ 1000)。

每組資料的第2-n+1行:每行三個整數xi

, yi

, ri

(0 ≤ xi

≤ w, 0 ≤ yi

≤ h, 1 ≤ ri

≤ 1000000)。

對於每組資料輸出"yes"或者"no"表示是否有滿足條件的行駛路線。

樣例輸入

2

10 4 2

5 1 1

5 3 1

10 4 2

5 1 1

6 3 1

樣例輸出

no

yes

詳細題解:傳送門

解題思路:對於多個相交的圓形區域,我們可以將它看成是乙個部分,若要使路徑不存在,只要任意乙個部分的最上端與上邊界相交或相切,最下端與下邊界相交或相切,即上邊界與下邊界聯通。將圓形區域的聯通量化成兩個點間的聯通,即將所有圓都看成乙個點,上下邊界各看成是乙個點a,b。圓與圓,圓與邊界間相交或相切,則兩個點間存在一條邊使兩點聯通,於是我們只要使用並查集看a,b是否聯通即可。

#include #include #include #include #include #include #include #include #include #include #include using namespace std;  

typedef long long ll;

const int n = 1008;

const int m = 100000000;

const int inf = 0x3fffffff;

const int mod = 1e9+7;

const double pi = acos(-1.0);

const double sm = 1e-9;

struct circlecir[n];

int parent[n];

bool cal( circle a , circle b )

int find( int a )

return b;

}void merge( int a , int b )

int main()

for( int i = 2 ; i < n+2 ; ++i )

for( int i = 2 ; i < n+1 ; ++i )

} if( find(0) == find(1) ) printf("no\n");

else printf("yes\n");

} return 0;

}

hihoCoder1307 穿越禁區

你把圖畫出來,發現只要有一坨圓把中間堵起來了,吉普車就過不去,其它情況下吉普車都是可以過去的。所以你就要看有沒有一坨圓把中間堵起來了。搞乙個並查集,把 一坨 圓都合併起來,然後看下每一坨圓的最大和最小縱座標,如果都超出了邊界,說明這坨圓把矩形的中間乙個區域堵起來了吉普車過不去。計算幾何 includ...

hiho coder 並查集應用

喜聞樂見卡輸入,喜聞樂見調 喜聞樂見。題目很簡單,簡單並查集。難點以下幾點 onemap的使用,把字元對映為數字。two並查集啦 three 喜聞樂見卡輸入,除錯好久卡好久。four 除錯半天找不到錯誤,於是換c,就過了。再交代一條 並查集要初始化。麼麼噠 正確 如下 include include...

HihoCoder 1515 帶權並查集

小hi的學校總共有n名學生,編號1 n。學校剛剛進行了一場全校的古詩文水平測驗。學校沒有公布測驗的成績,所以小hi只能得到一些小道訊息,例如x號同學的分數比y號同學的分數高s分。小hi想知道利用這些訊息,能不能判斷出某兩位同學之間的分數高低?input 第一行包含三個整數n,m和q。n表示學生總數,...