Box
2: 5
Box
1: 4
2: 1
在poj2138的基础上对线段排序就ok
ACcode:
#include <cstring>
#include <algorithm>
#include <cstdio>
#define maxn 5050
struct Point{
int x,y;
Point (){}
Point(int _x,int _y){
x=_x;
y=_y;
}
bool operator<(Point b)const{
return (x-b.x==0)?y-b.y:x<b.x;
}
bool operator==(Point b)const{
return (x-b.x==0)&&(y-b.y==0);
}
}p[maxn];
struct Line{
Point s,e;
Line(){}
Line(Point _s,Point _e){
s=_s;
e=_e;
}
bool operator <(Line t)const{
return (s==t.s)?e<t.e:s<t.s;
}
}my[maxn];
int ans[maxn];
int multi(Point p1,Point p2,Point p0){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int main(){
int n,m,x1,y1,x2,y2;
while(~scanf("%d",&n),n){
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for(int i=0;i<n;++i){
int a,b;
scanf("%d%d",&a,&b);
my[i]=Line(Point(a,y1),Point(b,y2));
}
my[n]=Line(Point(x2,y1),Point(x2,y2));
memset(ans,0,sizeof(ans));
std::sort(my,my+n+1);
for(int i=1;i<=m;++i){
int x,y;
scanf("%d%d",&x,&y);
Point tmp=Point(x,y);
int l=0,r=n,id;
while(l<=r){
int mid=(l+r)>>1;
if(multi(my[mid].s,my[mid].e,tmp)<0){
id=mid;
r=mid-1;
}
else l=mid+1;
}
ans[id]++;
}
std::sort(ans,ans+n+1);
puts("Box");
int cnt;
for(int i=0;i<=n;++i){
cnt=1;
if(ans[i]==0)continue;
while(ans[i]==ans[i+1]){
i++;
cnt++;
}
printf("%d: %d\n",ans[i],cnt);
}
}
return 0;
}
/*
4 10 0 10 100 0
20 20
40 40
60 60
80 80
5 10
15 10
95 10
25 10
65 10
75 10
35 10
45 10
55 10
85 10
5 6 0 10 60 0
4 3
15 30
3 1
6 8
10 10
2 1
2 8
1 5
5 5
40 10
7 9
0
*/