#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=2e5+5;
/*
二分查找
lower_bound_Search()
upper_bound_Search()
*/
int n;
struct node
{
int x,y;
} cnt[maxn];
int leftd[maxn],rightd[maxn];//与左右圆心的距离没有联系,可以分开
int lower_bound_Search(int m,int num[])
{
int l=0,r=n;
int mid;
while(l<r)
{
mid=(l+r)>>1;
if(num[mid]>=m)
{
r=mid;
}
else
{
l=mid+1;
}
}
return l;
}
int upper_bound_Search(int m,int num[])
{
int l=0,r=n;
int mid;
while(l<r)
{
mid=(l+r)>>1;
if(num[mid]<=m)
{
l=mid+1;
}
else
{
r=mid;
}
}
return l;
}
int main()
{
int ax,ay,bx,by,q;
int r1,r2;
int kase=1;
while(scanf("%d",&n))
{
if(n==0) break;
for(int i=0; i<n; i++)
{
scanf("%d%d",&cnt[i].x,&cnt[i].y);
}
scanf("%d%d%d%d%d",&ax,&ay,&bx,&by,&q);
for(int i=0; i<n; i++)
{
leftd[i]=(cnt[i].x-ax)*(cnt[i].x-ax)+(cnt[i].y-ay)*(cnt[i].y-ay);
rightd[i]=(cnt[i].x-bx)*(cnt[i].x-bx)+(cnt[i].y-by)*(cnt[i].y-by);
}
sort(leftd,leftd+n);
sort(rightd,rightd+n);
printf("Case %d:\n",kase++);
for(int i=0; i<q; i++)
{
scanf("%d%d",&r1,&r2);
int suml=0,sumr=0;
suml=upper_bound_Search(r1*r1,leftd);
sumr=upper_bound_Search(r2*r2,rightd);
int ans=n-suml-sumr;
if(ans<=0)//可能会小于0
{
printf("0\n");
}
else
{
printf("%d\n",ans);
}
}
}
return 0;
}
UVALive - 6144 Radiation (二分)
最新推荐文章于 2017-08-24 12:48:00 发布