题意:同poj 2318,不同的是,线段的顺序未排序,问题为,从小到大输出球的数目情况以及包含相同数目的格子有多少个。
解法:同poj 2318
/*************************************************************************
> File Name: poj2398.cpp
> Author:
> Mail:
> Created Time: 2014/8/12 19:41:00
************************************************************************/
#include<iostream>
#include<cstring>
#include <algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>
#define maxn 50000+5
#define inf 0x3f3f3f3f
#define INF 0x3FFFFFFFFFFFFFFFLL
#define rep(i,n) for(i=0;i<n;i++)
#define reP(i,n) for(i=1;i<=n;i++)
#define ull unsigned long long
#define ll long long
#define cle(a) memset(a,0,sizeof(a))
using namespace std;
int n;
struct point
{
double x,y;
};
struct line{
point start,end;
};
bool getbool(point a,point b,point c)
{
return ((b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x))<0;
}
line val[maxn];
bool cmp(line a,line b){
if(min(a.start.x,a.end.x)==min(b.start.x,a.end.x)){
return max(a.start.x,a.end.x)<max(b.start.x,a.end.x);
}
return min(a.start.x,a.end.x)<min(b.start.x,a.end.x);
}
int sum[maxn];
point num[maxn];
void doit(point x){
int i,j,k;
int l=0;
int r=n+1;
int ans;
while(l<=r){
int mid=(l+r)>>1;
if(getbool(x,val[mid].start,val[mid].end)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
sum[ans-1]++;
}
int main()
{
freopen("in.txt","r",stdin);
int i,j,k;
int m;
double x1,y1,x2,y2;
while(cin>>n){
cle(sum);
if(n==0)break;
scanf("%d%lf%lf%lf%lf",&m,&x1,&y1,&x2,&y2);
reP(i,n){
scanf("%lf%lf",&val[i].start.x,&val[i].end.x);
val[i].start.y=y1,val[i].end.y=y2;
}
sort(val+1,val+1+n,cmp);
val[0].start.x=x1,val[0].start.y=y1;
val[0].end.x=x1,val[0].start.y=y2;
val[n+1].start.x=x2,val[n+1].start.y=y1;
val[n+1].end.x=x2,val[n+1].end.y=y2;
rep(i,m){
scanf("%lf%lf",&num[i].x,&num[i].y);
doit(num[i]);
}
map<int,int>mp;
mp.clear();
for(i=0;i<=n;i++){
//cout<<sum[i]<<endl;
mp[sum[i]]++;
}
printf("Box\n");
reP(i,m){
if(mp[i])printf("%d: %d\n",i,mp[i]);
//<F5>if(mp[i])cout<<i<<":"<<mp[i]<<endl;
}
}
}