果然我还是最菜的==不接受反驳
(先考了day2喵喵喵)
Day2
T1:奶酪
期望得分:100分
实际得分:100分
考察:并查集
思路:这题其实之前做过了==。思路还是比较清晰的,读入时预处理出可以“通天下地”的奶酪,之后n²枚举所有的奶酪关系,可以互达的就连到一个并查集中。互达怎么判断?即使是空间也没关系,将两个奶酪的球心距离与二倍半径比较即可。之前的题解
Code
1 //15:31 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 6 using namespace std; 7 typedef long long ll; 8 9 int T,n; 10 int qwq[2000],qaq[2000],cnt,tot; 11 int f[2000]; 12 ll h,r; 13 struct point{ 14 ll x,y,z; 15 }p[2000]; 16 17 int getf(int x) 18 { 19 if(x==f[x]) return x; 20 else return getf(f[x]); 21 } 22 23 double dis(int i,int j) 24 { 25 return (double)sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y)+(p[i].z-p[j].z)*(p[i].z-p[j].z)); 26 } 27 28 int main() 29 { 30 freopen("cheese.in","r",stdin); 31 freopen("cheese.out","w",stdout); 32 scanf("%d",&T); 33 while(T--) 34 { 35 scanf("%d",&n); 36 scanf("%lld%lld",&h,&r); 37 for(int i=1;i<=n;i++) 38 { 39 scanf("%lld%lld%lld",&p[i].x,&p[i].y,&p[i].z); 40 if(p[i].z-r<=0) qwq[++cnt]=i; 41 if(p[i].z+r>=h) qaq[++tot]=i; 42 } 43 /*for(int i=1;i<=cnt;i++) printf("qwq:%d ",qwq[i]); 44 printf("\n"); 45 for(int i=1;i<=tot;i++) printf("qaq:%d ",qaq[i]); 46 printf("\n");*/ 47 for(int i=1;i<=n;i++) f[i]=i; 48 for(int i=1;i<=n;i++) 49 for(int j=1;j<=n;j++) 50 { 51 if(dis(i,j)<=(double)2*r) 52 { 53 int pp=getf(i); 54 int qq=getf(j); 55 if(qq!=pp) 56 f[qq]=pp; 57 } 58 } 59 bool flag=0; 60 for(int i=1;i<=cnt;i++) 61 { 62 for(int j=1;j<=tot;j++) 63 { 64 int a=qwq[i];int b=qaq[j]; 65 if(getf(a)==getf(b)) 66 { 67 flag=1; 68 printf("Yes\n"); 69 break; 70 } 71 } 72 if(flag) break; 73 } 74 if(!flag) printf("No\n"); 75 cnt=0;tot=0; 76 } 77 return 0; 78 }