/* poj 2318 TOYS 简单的计算几何 就是一个矩形的范围 被n条线段分成n+1个区域 然后有m个点的坐标,他们归属于所在的区域 然后输出各区域内点的个数 就是算一下点是在线段左侧还是右侧 用向量的叉积即可 保证线段所在的向量的x>0 那么 叉积>0 点在左侧 叉积<0 点在右侧 二分求解即可 */ #include<stdio.h> struct point { int x,y; }; struct zone { point s,x; int n; }l[5050]; int n,m,x1,x2,y1,y2; int cross(point p,point s,point e) { return (e.x-s.x)*(p.y-s.y)-(p.x-s.x)*(e.y-s.y); } int main() { int i,a,b,max,min,mid,cas=0; point z; while(scanf("%d",&n),n) { scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2); l[0].s.x=x1,l[0].s.y=y1,l[0].x.x=x1,l[0].x.y=y2,l[0].n=0; l[n+1].s.x=x2,l[n+1].s.y=y1,l[n+1].x.x=x2,l[n+1].x.y=y2,l[n+1].n=0; for(i=1;i<=n;i++) { scanf("%d%d",&a,&b); l[i].s.x=a,l[i].s.y=y1,l[i].x.x=b,l[i].x.y=y2,l[i].n=0; } for(i=1;i<=m;++i) { scanf("%d%d",&a,&b); z.x=a,z.y=b; min=0,max=n+1; while(min+1<max) { mid=(min+max)/2; if(cross(z,l[mid].x,l[mid].s)>0) max=mid; else min=mid; } l[min].n++; } if(cas++) printf("\n"); for(i=0;i<=n;i++) printf("%d: %d\n",i,l[i].n); } return 0; }