提交时间:2024-03-31 18:51:04
运行 ID: 27990
#include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1e6+10; const ll inf=1e17+10; const ll mod=998244353; int n,m; struct node{ double x,y; }rab[maxn],hill[maxn]; double r[maxn],k[maxn],p[maxn],pos1[maxn],pos2[maxn],flag[maxn]; int fa[maxn]; int find_root(int x){ if(fa[x]==x) return x; return fa[x]=find_root(fa[x]); } int main(){ // freopen("test.in","r",stdin); // freopen("beacons.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%lf%lf",&rab[i].x,&rab[i].y); fa[i]=i; } for(int i=1;i<=m;i++){ scanf("%lf%lf%lf",&hill[i].x,&hill[i].y,&r[i]); } int num=0; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ num++; if(rab[j].x==rab[i].x) k[num]=inf; else k[num]=(rab[j].y-rab[i].y)/(rab[j].x-rab[i].x); p[num]=rab[i].y-k[num]*rab[i].x; pos1[num]=i; pos2[num]=j; } } int cnt=n; for(int i=1;i<=num;i++){ int x=find_root(pos1[i]); int y=find_root(pos2[i]); if(x==y) continue; bool fg=0; for(int j=1;j<=m;j++){ if(k[i]==inf){ double a=1; double b=-2*hill[j].y; double c=rab[(int)pos1[i]].x*rab[(int)pos1[i]].x+hill[j].y*hill[j].y+hill[j].x*hill[j].x-2*hill[j].x*rab[(int)pos1[i]].x-r[j]*r[j]; double derta=b*b-4*a*c; if(derta<0) continue; double ans1=(sqrt(derta)-b)/(2*a); double ans2=(-sqrt(derta)-b)/(2*a); int ly=min(rab[(int)pos1[i]].y,rab[(int)pos2[i]].y); int ry=max(rab[(int)pos1[i]].y,rab[(int)pos2[i]].y); if((ans1>=ly&&ans1<=ry)||(ans2>=ly&&ans2<=ry)){ fg=1; break; } continue; } double a=k[i]*k[i]+1; double b=2*(p[i]*k[i]-hill[j].y*k[i]-hill[j].x); double c=hill[j].y*hill[j].y+hill[j].x*hill[j].x-r[j]*r[j]-2*hill[j].y*p[i]+p[i]*p[i]; double derta=b*b-4*a*c; if(derta<0){ continue; } double ans1=(sqrt(derta)-b)/(2*a); double ans2=(-sqrt(derta)-b)/(2*a); double lx=min(rab[(int)pos1[i]].x,rab[(int)pos2[i]].x); double rx=max(rab[(int)pos1[i]].x,rab[(int)pos2[i]].x); if((ans1>=lx&&ans1<=rx)||(ans2>=lx&&ans2<=rx)){ fg=1; break; } //cout<<pos1[i]<<" "<<pos2[i]<<" "<<fg<<" "<<ans1<<" "<<ans2<<" "<<lx<<" "<<rx<<endl; } if(!fg) fa[x]=y,cnt--; } printf("%d",cnt-1); fclose(stdin); fclose(stdout); return 0; }