50分求调

P3958 [NOIP2017 提高组] 奶酪

```cpp #include<bits/stdc++.h> #define ll long long using namespace std; ll t,n,h,r,a1,a2; ll x[1000+10],y[1000+10],z[1000+10]; ll F[2000+10]; ll sum1[1000+10],sum2[1000+10]; int G(int x) { if(F[x]!=x)F[x]=G(F[x]); return F[x]; } void HB(int x,int y) { F[G(x)]=G(y); return; } bool check(int a,int b) { // cout<<a<<" "<<b; ll s1=(x[a]-x[b])*(x[a]-x[b]); // cout<<s1<<" "; ll s2=(y[a]-y[b])*(y[a]-y[b]); // cout<<s2<<" "; ll s3=(z[a]-z[b])*(z[a]-z[b]); // cout<<s3<<" "; ll sum=labs((s1+s2+s3)); // cout<<sum<<"\n"; return sum<=(4*r*r); } int main(){ scanf("%d",&t); while(t--) { a1=a2=0; scanf("%lld%lld%lld",&n,&h,&r); for(int i=0;i<=n+1;i++) { F[i]=i; } for(int i=1;i<=n;i++) { scanf("%lld%lld%lld",&x[i],&y[i],&z[i]); } for(int i=1;i<=n;i++) { if(z[i]<=r) { sum1[++a1]=i; } if(z[i]+r>=h) { sum2[++a2]=i; } // cout<<z[i]-r<<" "<<z[i]+r<<"\n"; } // cout<<n<<" "; for(int i=2;i<=n;i++) { for(int j=1;j<i;j++) { if(check(i,j))HB(i,j); } } bool bj=true; //cout<<a1<<" "<<a2<<"\n"; for(int i=1;i<=a1;i++) { for(int j=1;j<=a2;j++) { if(G(sum1[i])==G(sum2[j])) { bj=false; break; } //cout<<G(sum1[i])<<" "<<G(sum2[j])<<" "<<bj<<"\n"; } if(!bj)break; } if(!bj)cout<<"Yes\n"; else cout<<"No\n"; } return 0; } ``` F[]数组初始化要放在输入n后面,不然有的值会为0
by chenjliang @ 2023-07-18 19:04:34


@[chenjliang](/user/560771) 谢谢调整
by 0928_14 @ 2023-07-19 07:17:59


|