题意:给出矩形的左上和右下的坐标,在矩形中有n个木棒,木棒之间不会相交,然后给出木棒上下端点的横坐标,这些木棒将矩形分成多个区域,接着有m个玩具,给出玩具的坐标。输出在每个区域中玩具的个数。
思路:叉积判断点是否在四边形区域内。和poj 2318一样的题,只是输入n个木棒的坐标时为无序输入,需进行排序处理,输出时输出玩具数大于0的区域。
poj 2318参考:http://blog.csdn.net/u014552756/article/details/50672638
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h>
using namespace std;
struct Point
{
int x,y;
Point() {}
Point(int _x,int _y)
{
x = _x;
y = _y;
}
Point operator -(const Point &b)const
{
return Point(x - b.x,y - b.y);
}
int operator *(const Point &b)const
{
return x*b.x + y*b.y;
}
int operator ^(const Point &b)const
{
return x*b.y - y*b.x;
}
};
struct Line
{
Point s,e;
Line() {}
Line(Point _s,Point _e)
{
s = _s;
e = _e;
}
};
int xmult(Point p0,Point p1,Point p2) //计算p0p1 X p0p2
{
return (p1-p0)^(p2-p0);
}
const int MAXN = 5050;
Line line[MAXN];
int ans[MAXN];
int num[MAXN];
bool cmp(Line a,Line b)
{
return a.s.x < b.s.x;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m,x1,y1,x2,y2;
while(scanf("%d",&n) == 1 && n)
{
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
int Ui,Li;
for(int i = 0; i < n; i++)
{
scanf("%d%d",&Ui,&Li);
line[i] = Line(Point(Ui,y1),Point(Li,y2));
}
line[n] = Line(Point(x2,y1),Point(x2,y2));
sort(line,line+n+1,cmp);
int x,y;
Point p;
memset(ans,0,sizeof(ans));
while( m-- )
{
scanf("%d%d",&x,&y);
p = Point(x,y);
int l = 0,r = n;
int tmp;
while( l <= r)
{
int mid = (l + r)/2;
if(xmult(p,line[mid].s,line[mid].e) < 0)
{
tmp = mid;
r = mid - 1;
}
else l = mid + 1;
}
ans[tmp]++;
}
for(int i = 1; i <= n; i++)
num[i] = 0;
for(int i = 0; i <= n; i++)
if(ans[i]>0)
num[ans[i]]++;
printf("Box\n");
for(int i = 1; i <= n; i++)
if(num[i]>0)
printf("%d: %d\n",i,num[i]);
}
return 0;
}