题目链接:http://poj.org/problem?id=2398
Toy Storage
题目大意:给你n个区间,再给你m个玩具的坐标,然后让你求出各区间玩具的个数,最后输出1个玩具的区间有几个,2个玩具的区间有几个,依次类推。。。(有玩具才输出)
解题思路:如果点在四边形内,点和左边界的点乘积再乘以点和右边界的点乘积为负。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct point
{
int x,y;
};
struct Line
{
point a,b;
}line[2010];
int toy[2010];
int ans[2010];
bool cmp(Line p,Line q)
{
return min(p.a.x,p.b.x)<min(q.a.x,q.b.x)||((min(p.a.x,p.b.x)==min(q.a.x,q.b.x))&&(max(p.a.x,p.b.x)<max(q.a.x,q.b.x)));
}
int cross(point p0,point p1,point p2)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
void binarysearch(point t,int n)
{
int l=0,r=n-1,mid;
while(l<r)
{
mid=(l+r)>>1;
if(cross(t,line[mid].a,line[mid].b)>0)
l=mid+1;
else
r=mid;
}
if(cross(t,line[l].a,line[l].b)<0)
toy[l]++;
else
toy[l+1]++;
}
int main()
{
int n,m,x1,y1,x2,y2;
while(scanf("%d",&n),n)
{
int i,u,l;
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for(i=0;i<n;i++)
{
scanf("%d%d",&u,&l);
line[i].a.x=u;
line[i].a.y=y1;
line[i].b.x=l;
line[i].b.y=y2;
}
sort(line,line+n,cmp);
memset(toy,0,sizeof(toy));
memset(ans,0,sizeof(ans));
point t;
for(i=0;i<m;i++)
{
scanf("%d%d",&t.x,&t.y);
binarysearch(t,n);
}
for(i=0;i<=n;i++)
ans[toy[i]]++;
printf("Box\n");
for(i=1;i<=m;i++)
{
if(ans[i])
{
printf("%d: %d\n", i, ans[i]);
m-=i*toy[i];
}
}
}
return 0;
}