//和2318差不多,只是輸入的board是無序的,輸出是玩具數為t(>0)的箱子數(>0)
#include<iostream>
#include<stdlib.h>
using namespace std;
#define MAXN 5000+1
#define eps 1e-8
#define _sign(x) ((x)>eps?1:((x)<-eps?2:0))


struct point
{int x,y;};

struct line
{point a,b;};

int ans[MAXN];
line board[MAXN];


double xmult(point p0,point p1,point p2)
{//叉積,囧
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int cmp(const void *a,const void *b)


{
line *aa=(line*)a,*bb=(line*)b;
if(aa->a.x == bb->a.x)
return aa->b.x - bb->b.y;
else return aa->a.x - bb->a.x;
}
int main()


{
int n,m,x1,y1,x2,y2,u1,u2,i;
point toys;
while(scanf("%d",&n)!=EOF && n )

{
memset(ans,0,sizeof(ans));
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for(i=0;i<n;i++)

{
scanf("%d%d",&u1,&u2);
board[i].a.x=u1;
board[i].a.y=y1;
board[i].b.x=u2;
board[i].b.y=y2;
}
qsort(board,n,sizeof(board[0]),cmp);
board[n].a.x=x2;
board[n].a.y=y1;
board[n].b.x=x2;
board[n].b.y=y2;
for(i=0;i<m;i++)

{
scanf("%d%d",&(toys.x),&(toys.y));
int low=0,hig=n,mid;
while(low+1<hig)

{
mid=(low+hig)>>1;
double res=xmult(board[mid].a,board[mid].b,toys);
if(res>0) low=mid;
else hig=mid;
}
if(xmult(board[low].a,board[low].b,toys)<0) ans[low]++;
else ans[low+1]++;
}
printf("Box\n");
int t=1,c;
for(t=1;t<=m;t++)

{
for(i=0,c=0;i<=n;i++)

{
if(ans[i]==t)

{
c++;
ans[i]=0;
}
}
if(c>0)
printf("%d: %d\n",t,c);
m=m-c*t;
}
}
return 0;
}
posted on 2009-10-04 13:12
wyiu 閱讀(202)
評論(0) 編輯 收藏 引用 所屬分類:
POJ