提交时间:2024-03-31 16:37:32

运行 ID: 27953

#include<bits/stdc++.h> #define int long long #define doub long double using namespace std; const int maxn=1e3+7; const doub eps=1e-6; vector<int> E[maxn]; bool vis[maxn]; int n,m; struct poi{ int x,y; }p[maxn]; struct cir{ int x,y,r; }c[maxn]; bool dc(int ci,int pi,int pj){ int r=c[ci].r; int xz=c[ci].x; int yz=c[ci].y; int xi=p[pi].x; int xj=p[pj].x; int yi=p[pi].y; int yj=p[pj].y; if(xi==xj){ if(r*r-(xi-xz)*(xi-xz)<-eps)return 0; doub yf=yz-sqrt(r*r-(xi-xz)*(xi-xz)); doub ys=yz+sqrt(r*r-(xi-xz)*(xi-xz)); if(yf-min(yi,yj)>=eps&&yf-max(yi,yj)<=-eps)return 1; if(ys-min(yi,yj)>=eps&&ys-max(yi,yj)<=-eps)return 1; return 0; } doub k=1.0*(yj-yi)/(xj-xi); doub t=1.0*(xj*yi-xi*yj)/(xj-xi); //cout<<pi<<" "<<pj<<endl; //cout<<"the line: "<<k<<"x+"<<t<<endl; doub a=(k*k+1)*1.0; doub b=(-2*xz+2*k*t-2*yz*k)*1.0; doub c=(xz*xz+(t-yz)*(t-yz)-r*r)*1.0; //cout<<a<<" "<<b<<" "<<c<<endl; if(b*b-4*a*c<-eps)return 0; doub t1=(-b+sqrt(b*b-4*a*c))/(2*a); doub t2=(-b-sqrt(b*b-4*a*c))/(2*a); if(t1-min(xi,xj)>=eps&&t1-max(xi,xj)<=-eps)return 1; if(t2-min(xi,xj)>=eps&&t2-max(xi,xj)<=-eps)return 1; return 0; } int fa[maxn]; int findrt(int x){ return x==fa[x]?x:fa[x]=findrt(fa[x]); } void mg(int x,int y){ int tx=findrt(x); int ty=findrt(y); fa[tx]=ty; } bool uni(int x,int y){ return findrt(x)==findrt(y); } signed main(){ // freopen("beacons.in","r",stdin); // freopen("beacons.out","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>p[i].x>>p[i].y; fa[i]=i; } for(int i=1;i<=m;i++){ cin>>c[i].x>>c[i].y>>c[i].r; } random_shuffle(p+1,p+n+1); random_shuffle(c+1,c+m+1); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ if(uni(i,j))continue; bool b=false; for(int k=1;k<=m;k++){ if(dc(k,i,j)){ b=true; break; } } if(!b)mg(i,j); } } int cnt=0; for(int i=1;i<=n;i++){ if(findrt(i)==i)cnt++; } cout<<cnt-1<<endl; return 0; }