In fact, a point that is covered by a circle can be transformed into an interval problem.
#include <cstdio>#include<cstring>#include<cmath>#include<queue>#include<algorithm>using namespacestd;Const intmaxn= ++Ten;structx{Doublex, y; DoubleL,r;} S[MAXN];DoubleD;intN;BOOLfail;BOOLcmpConstX&a,Constx&b) { if(A.L==B.L)returna.r<B.R; returna.l<B.L;}intMain () {intt=1; while(~SCANF ("%D%LF",&n,&d)) {if(n==0&&d==0) Break; Fail=0; for(intI=1; i<=n; i++) scanf ("%LF%LF",&s[i].x,&s[i].y); for(intI=1; i<=n; i++) { if(s[i].y>d) fail=1; S[i]. L=S[I].X-SQRT (d*d-s[i].y*s[i].y); S[i]. R=S[I].X+SQRT (d*d-s[i].y*s[i].y); } sort (S+1, s+1+n,cmp); intans=0; Doublest=-123456789, en=-123456789; for(intI=1; i<=n; i++) { if(S[i]. L>=st&&s[i]. l<=en) {St=Max (St,s[i]. L); En=min (en,s[i]. R); } Else{ans++; St=S[i]. L En=S[i]. R }} printf ("Case %d:", t++); if(fail) printf ("-1\n"); Elseprintf"%d\n", ans); } return 0;}
POJ 1328 Radar Installation