洛谷P3958 乳酪

2021-09-29 01:08:27 字數 1854 閱讀 2575

原題位址

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,它知道乳酪中所有空洞的球心所在的坐 標。如果兩個空洞相切或...