提交时间:2024-03-31 16:30:41

运行 ID: 27950

#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; } void dfs(int u){ vis[u]=true; for(int i=0;i<E[u].size();i++){ int v=E[u][i]; if(!vis[v])dfs(v); } } 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; } 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++){ bool b=false; for(int k=1;k<=m;k++){ //cout<<i<<" "<<j<<" "<<k<<endl<<dc(k,i,j)<<endl; b|=dc(k,i,j); } if(!b){ E[i].push_back(j); E[j].push_back(i); } } } int cnt=0; for(int i=1;i<=n;i++){ if(!vis[i])dfs(i),cnt++; } cout<<cnt-1<<endl; return 0; }