水题。。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <bitset>
using namespace std;
const int MAXN=1e3+5;
struct Point;
typedef struct Point V;
struct Point{
int x,y;
Point(){}
Point(int xx,int yy):x(xx),y(yy){}
V operator -(Point p){
return Point(x-p.x,y-p.y);
}
int operator ^(Point p){
return x*p.y-y*p.x;
}
};
struct Segment{
Point p1,p2;
Segment(){}
Segment(Point pp1,Point pp2):p1(pp1),p2(pp2){}
bool isLeft(Point p){
return ((p1-p)^(p2-p))<0;
}
};
int n,m;
Segment parti[MAXN];
int c[MAXN];
int t[MAXN];
bool cmp(const Segment& a,const Segment& b){
return a.p1.x<b.p1.x;
}
void initialize(){
memset(c,0,sizeof c);
memset(t,0,sizeof t);
sort(parti,parti+n+1,cmp);
}
void counter(Point p){
int l=0,r=n,mid;
while(l<r){
mid=l+(r-l)/2;
if(parti[mid].isLeft(p)) r=mid;
else l=mid+1;
}
++c[l];
}
void solve(){
for(int i=0;i<=n;++i){
++t[c[i]];
}
cout<<"Box"<<endl;
for(int i=1;i<=m;++i){
if(t[i]) cout<<i<<": "<<t[i]<<endl;
}
}
int main(){
ios::sync_with_stdio(false);
while(cin>>n,n){
int x1,x2,y1,y2,U,L;
cin>>m>>x1>>y1>>x2>>y2;
for(int i=0;i<n;++i){
cin>>U>>L;
parti[i]=Segment(Point(U,y1),Point(L,y2));
}
parti[n]=Segment(Point(x2+1,y2),Point(x2+1,y1));
initialize();
for(int i=0;i<m;++i){
cin>>x1>>y1;
counter(Point(x1,y1));
}
solve();
}
return 0;
}