和2318一样的题。。输出改下就好了。思路就是判断点和线段的关系。。
//Memory: 484K
//Time: 16MS
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;
struct POINT //点
{
double x,y;
POINT():x(0),y(0){};
POINT(double _x, double _y):x(_x),y(_y){};
};
struct LINESEG //线段
{
POINT s;
POINT e;
LINESEG(POINT a, POINT b) { s=a; e=b;}
LINESEG() { }
};
double relation_lr(POINT p,LINESEG l) //return<0 p在l左侧 return>0 p在l右侧
{
double a,b,c;
a=l.e.y-l.s.y;
b=l.s.x-l.e.x;
c=l.e.x*l.s.y-l.s.x*l.e.y;
return (a*p.x+b*p.y+c);
}
double dotmultiply(POINT p1,POINT p2,POINT p0)
{
return ((p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y));
}
double dist(POINT p1,POINT p2)
{
return( sqrt( (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) ) );
}
bool cmpl(LINESEG l1,LINESEG l2)
{
if(l1.s.x==l2.s.x)
return l1.e.x<l2.e.x;
return l1.s.x<l2.s.x;
}
bool cmpp(POINT p1,POINT p2)
{
return p1.x<p2.x;
}
int main()
{
POINT p[5005];
LINESEG l[5005];
double x1,y1,x2,y2;
int n,m;
int num[5005];
int put[1005];
while(cin>>n && n)
{
cin>>m>>x1>>y1>>x2>>y2;
l[0].s.x=l[0].e.x=x1;
l[0].s.y=l[n+1].s.y=y2;
l[0].e.y=l[n+1].e.y=y1;
l[n+1].s.x=l[n+1].e.x=x2;
int i,j;
for(i=0;i<=n;i++)
{
num[i]=0;
put[i]=0;
}
for(i=1;i<=n;i++)
{
cin>>l[i].e.x>>l[i].s.x;
l[i].e.y=y1;
l[i].s.y=y2;
}
for(i=1;i<=m;i++)
cin>>p[i].x>>p[i].y;
sort(l,l+n+1,cmpl);
sort(p+1,p+m+1,cmpp);
i=0;j=1;
while(i<=n)
{
double a=relation_lr(p[j],l[i+1]),b=relation_lr(p[j],l[i]),c=relation_lr(p[j],l[i]);
if(relation_lr(p[j],l[i+1])>0)
{
i++;
}
else if(relation_lr(p[j],l[i])>0)
{
num[i]++;
j++;
}
else if(relation_lr(p[j],l[i])<0)
{
i--;
}
if(j>m)
break;
}
for(i=0;i<=n;i++)
put[ num[i] ]++;
cout<<"Box"<<endl;
for(i=1;i<=n;i++)
if(put[i]!=0)
cout<<i<<": "<<put[i]<<endl;
}
return 0;
}