http://www.codeforces.com/contest/84/problem/C 二分在cf很常见,可是怎么当时就是想不出来! #include<iostream> using namespace std; #include<algorithm> int n,m; struct node { int x,r,i,hit; }p[10010]; bool cmp(const node &a,const node &b) { return a.x<b.x; } bool comp(const node &a,const node &b) { return a.i<b.i; } int find(int x)//二分查找 { int l,mid,r; l=1,r=n; while(r-l>1) { mid=(l+r)/2; if(p[mid].x==x)return mid; if(p[mid].x<x)//找出大概范围即可,接下来可以向前或向后找 l=mid; if(p[mid].x>x) r=mid; } return l; } bool chk(int nn,int x,int y) { if((p[nn].x-x)*(p[nn].x-x)+y*y<=p[nn].r*p[nn].r) return true; else return false; } int main() { //freopen("a.txt","r",stdin); while(scanf("%d",&n)!=EOF) { int i,j,k; int x,y; for(i=1;i<=n;i++) { scanf("%d%d",&p[i].x,&p[i].r); p[i].hit=-1; p[i].i=i; } sort(p+1,p+n+1,cmp);//这里已经把p的顺序打乱,所以后面还要对p[i].i排序 //for(i=1;i<=n;i++) // printf("%d ",p[i].i); //printf("/n"); scanf("%d",&m); int cnt=0; for(i=0;i<m;i++) { scanf("%d%d",&x,&y); j=find(x);//printf("!j=%d/n",j); if(p[j-1].hit==-1 && chk(j-1,x,y)) { cnt++; p[j-1].hit=i+1; } if(p[j].hit==-1 && chk(j,x,y)) { cnt++; p[j].hit=i+1; } if(p[j+1].hit==-1 && chk(j+1,x,y)) { cnt++; p[j+1].hit=i+1; } } sort(p+1,p+1+n,comp); printf("%d/n",cnt); for(i=1;i<=n;i++) { printf("%d ",p[i].hit); } printf("/n"); } return 0; }