JZOJ 5476. 【NOIP2017提高组正式赛】奶酪
Description
現(xiàn)有一塊大奶酪,它的高度為 h,它的長度和寬度我們可以認為是無限大的,奶酪中間有許多 半徑相同 的球形空洞。我們可以在這塊奶酪中建立空間坐標系,在坐標系中,奶酪的下表面為z = 0,奶酪的上表面為z = h。現(xiàn)在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐標。兩相切或是相交,則 Jerry 可以從其中一個空洞跑到另一個,特別地,如果一個空洞與下表面相切或是相交,Jerry 則可以從奶酪下表面跑進空洞;如果一個空洞與上表面相切或是相交,Jerry 則可以從空洞跑到奶酪上表面。位于奶酪下表面的 Jerry 想知道,在 不破壞奶酪 的情況下,能否利用已有的空洞跑到奶酪的上表面去?Input
每個輸入文件包含多組數(shù)據(jù)。輸入文件的第一行,包含一個正整數(shù) T,代表該輸入文件中所含的數(shù)據(jù)組數(shù)。接下來是 T 組數(shù)據(jù),每組數(shù)據(jù)的格式如下:第一行包含三個正整數(shù) n,h 和 r,兩個數(shù)之間以一個空格分開,分別代表奶酪中空洞的數(shù)量,奶酪的高度和空洞的半徑。接下來的 n 行,每行包含三個整數(shù) x、y、z,兩個數(shù)之間以一個空格分開,表示空洞球心坐標為(x,y,z)。Output
輸出文件包含 T 行,分別對應 T 組數(shù)據(jù)的答案,如果在第 i 組數(shù)據(jù)中,Jerry 能從下表面跑到上表面,則輸出“ Yes ”,如果不能,則輸出“ No ”(均不包含引號)。Sample Input
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
Sample Output
Yes
No
Yes
【輸入輸出樣例 1 說明】
第一組數(shù)據(jù),由奶酪的剖面圖可見:
第一個空洞在(0,0,0)與下表面相切
第二個空洞在(0,0,4)與上表面相切
兩個空洞在(0,0,2)相切
輸出 Yes
第二組數(shù)據(jù),由奶酪的剖面圖可見:
兩個空洞既不相交也不相切
輸出 No
第三組數(shù)據(jù),由奶酪的剖面圖可見:
兩個空洞相交
且與上下表面相切或相交
輸出 Yes
Data Constraint
對于 20%的數(shù)據(jù),n = 1,1 ≤ h , r ≤ 10,000,坐標的絕對值不超過 10,000。
對于 40%的數(shù)據(jù),1 ≤ n ≤ 8, 1 ≤ h , r ≤ 10,000,坐標的絕對值不超過 10,000。
對于80%的數(shù)據(jù),1 ≤ n ≤ 1,000, 1 ≤ h , r ≤ 10,000,坐標的絕對值不超過10,000。
對于 100%的數(shù)據(jù),1 ≤ n ≤ 1,000,1 ≤ h , r ≤ 1,000,000,000,T ≤ 20,坐標的絕對值不超過 1,000,000,000。
Solution
這題就直接并查集。
把上下邊界各看做一個集合,再把那些圓心也看作集合。
之后把能相連的集合并起來即可。
時間復雜度 O(T?N2?α(N)) 。
Code
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int N=1005; struct data {double x,y,z; }a[N]; double h,r; int f[N],size[N]; int read() {int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w; } int get(int x) {return f[x]==x?x:f[x]=get(f[x]); } void merge(int x,int y) {if(get(x)==get(y)) return;if(size[f[x]]<size[f[y]]) swap(x,y);size[f[x]]+=size[f[y]];f[f[y]]=x; } double p(double x) {return x*x; } bool check(int x,int y) {return sqrt(p(a[x].x-a[y].x)+p(a[x].y-a[y].y)+p(a[x].z-a[y].z))<=2*r; } int main() {int T=read();while(T--){int n=read();h=read(),r=read();int st=n+1,en=n+2;size[f[st]=st]=1,size[f[en]=en]=1;for(int i=1;i<=n;i++){size[f[i]=i]=1;a[i].x=read(),a[i].y=read(),a[i].z=read();if(a[i].z<=r) merge(st,i);if(h-a[i].z<=r) merge(en,i);for(int j=1;j<i;j++)if(check(i,j)) merge(i,j);}if(get(st)==get(en)) printf("Yes\n"); else printf("No\n");}return 0; }總結(jié)
以上是生活随笔為你收集整理的JZOJ 5476. 【NOIP2017提高组正式赛】奶酪的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NOIP 2017 总结
- 下一篇: JZOJ 5474. 【NOIP2017