原題位址
17年noip提高組的第二題,看到好多人都用搜尋,就拿並查集來水一篇題解
現有一塊**酪,它的高度為h,它的長度和寬度我們可以認為是無限大的,乳酪
中間有許多半徑相同的球形空洞。我們可以在這塊乳酪中建立空間座標系,在坐
標係中,乳酪的下表面為z=0,乳酪的上表面為z=h。
現在,乳酪的下表面有乙隻小老鼠jerry,它知道乳酪中所有空洞的球心所在的坐
標。如果兩個空洞相切或是相交,則jerry可以從其中乙個空洞跑到另乙個空洞,
特別地,如果乙個空洞與下表面相切或是相交,jerry則可以從乳酪下表面跑進空
洞;如果乙個空洞與上表面相切或是相交,jerry則可以從空洞跑到乳酪上表面。
位於乳酪下表面的jerry想知道,在不破壞乳酪的情況下,能否利用已有的空洞跑到乳酪的上表面去?
空間內兩點?1(x1,y1,z1)、?2(x2,y2,z2)的距離公式如下:
dist(?1,?2) = sqrt( (x1−x2)^2+(y1−y2)^2+(z1−z2)^2 )
輸入檔名為cheese.in。
每個輸入檔案包含多組資料。
輸入檔案的第一行,包含乙個正整數t,代表該輸入檔案中所含的資料組數。接下來是t組資料,每組資料的格式如下:
第一行包含三個正整數n,h和r,兩個數之間以乙個空格分開,分別代表乳酪中空洞的數量,乳酪的高度和空洞的半徑。
接下來的n行,每行包含三個整數x、y、z,兩個數之間以乙個空格分開,表示空洞球心座標為(x,y,z)。
輸出檔名為cheese.out。
輸出檔案包含t行,分別對應t組資料的答案,如果在第i組資料中,jerry能從下表
面跑到上表面,則輸出「yes」,如果不能,則輸出「no」(均不包含引號)。
3
2 4 1
0 0 1
0 0 3
2 5 1
0 0 1
0 0 4
2 5 2
0 0 2
2 0 4
yes
no yes
要求判斷底面與頂面是否相連,那麼只要要求不管經過多少園, 他們連起來就好了呀, 剛剛好這不就是並查集的活兒了嘛, 於是有了下面的**
#include
#include
using
namespace std;
const
int n=
1010
;long
long t, n, r, h;
struct circlec[n]
;int rt[n]
;//將第0個作為頂面, 第n+1個作為底面
bool
islinked
(circle a, circle b//按公式判斷是否相通,由於切和交都是通, 所以<=
intgetroot
(int x)
void
merge
(int x,
int y)
intmain()
if(getroot
(n+1)==
getroot(0
))printf
("yes\n");
//判斷頂面和底面是否在乙個並集內, 由於乙個並集內的都是能相通的,所以頂面與底面相通
//80分的並查集可能是沒套getroot吧,反正我當時這麼錯的
else
printf
("no\n");
}return0;
}
(所以怎麼加目錄啊, 自閉) 洛谷P3958 乳酪
現有一塊 酪,它的高度為 h 它的長度和寬度我們可以認為是無限大的,乳酪 中間有許多 半徑相同 的球形空洞。我們可以在這塊乳酪中建立空間座標系,在座標系中,乳酪的下表面為 z 0 乳酪的上表面為 z h 現在,乳酪的下表面有乙隻小老鼠 jerry,它知道乳酪中所有空洞的球心所在的坐 標。如果兩個空洞...
洛谷P3958 乳酪
現有一塊 酪,它的高度為 hh,它的長度和寬度我們可以認為是無限大的,乳酪 中間有許多 半徑相同 的球形空洞。我們可以在這塊乳酪中建立空間座標系,在座標系中,乳酪的下表面為z 0z 0,乳酪的上表面為z hz h。現在,乳酪的下表面有乙隻小老鼠 jerry,它知道乳酪中所有空洞的球心所在的坐 標。如...
洛谷P3958 乳酪
題目描述 現有一塊 酪,它的高度為 h,它的長度和寬度我們可以認為是無限大的,乳酪中間有許多半徑相同 的球形空洞。我們可以在這塊乳酪中建立空間座標系,在座標系中,乳酪的下表面為z 0,頂面為z h。現在,乳酪的下表面有乙隻小老鼠 jerry,它知道乳酪中所有空洞的球心所在的坐 標。如果兩個空洞相切或...