時間限制:
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"表示是否有滿足條件的行駛路線。
樣例輸入
210 4 2
5 1 1
5 3 1
10 4 2
5 1 1
6 3 1
樣例輸出
noyes
詳細題解:傳送門
解題思路:對於多個相交的圓形區域,我們可以將它看成是乙個部分,若要使路徑不存在,只要任意乙個部分的最上端與上邊界相交或相切,最下端與下邊界相交或相切,即上邊界與下邊界聯通。將圓形區域的聯通量化成兩個點間的聯通,即將所有圓都看成乙個點,上下邊界各看成是乙個點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表示學生總數,...