Mom and dad have a problem - their child John never puts his toys away when he is finished playing with them. They gave John a rectangular box to put his toys in, but John is rebellious and obeys his parents by simply throwing his toys into the box. All the toys get mixed up, and it is impossible for John to find his favorite toys.
John's parents came up with the following idea. They put cardboard partitions into the box. Even if John keeps throwing his toys into the box, at least toys that get thrown into different bins stay separated. The following diagram shows a top view of an example toy box.
For this problem, you are asked to determine how many toys fall into each partition as John throws them into the toy box.
Input
Output
Sample Input
5 6 0 10 60 0
3 1
4 3
6 8
10 10
15 30
1 5
2 1
2 8
5 5
40 10
7 9
4 10 0 10 100 0
20 20
40 40
60 60
80 80
5 10
15 10
25 10
35 10
45 10
55 10
65 10
75 10
85 10
95 10
0
Sample Output
0: 2
1: 1
2: 1
3: 1
4: 0
5: 1 0: 2
1: 2
2: 2
3: 2
4: 2
Hint
给出一个矩形抽屉,然后有n个板子放在其中,连接上下底。给出m个玩具的坐标(视作点),
问n+1个区间内,每个区间中有多少玩具。
思路:
首先给出的木板是从左往右排序过的,如果一个点在某个板子x左边,一定会在板子y>x 左边,所以满足单调性,二分。
然后是判断点在直线左边,此处用的是向量p-l与向量u-l之间的关系,若叉乘值小于0,表示点p在直线l-u左边,反之则在右边。
详细请见:http://blog.****.net/u013557725/article/details/40146311
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
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);
}
}u[],l[];
int n,m,x1,y1,x2,y2,ans[];
int cross(point a,point b)//计算叉乘
{
return a.x*b.y-b.x*a.y;
}
int main()
{
while (scanf("%d",&n)!=EOF&&n!=)
{
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
memset(ans,,sizeof(ans));
for (int i=;i<n;i++)
{
int uu,ll;
scanf("%d%d",&uu,&ll);
u[i]=point(uu,y1);
l[i]=point(ll,y2);//用point储存直线的端点
}
for (int i=;i<m;i++)
{
point p;
scanf("%d%d",&p.x,&p.y);
int le=,ri=n,t=n;//因二分无法判断最右边的情况,所以t先赋值为n
while (le<=ri)
{
int mid=(le+ri)/;
if (cross(p-l[mid],u[mid]-l[mid])<=)//叉乘小于0,p在直线ui-li左边,查找左区间,否则查找右区间
{
t=mid;
ri=mid-;
}
else le=mid+;
}
++ans[t];
}
for (int i=;i<=n;i++)
{
printf("%d: %d\n",i,ans[i]);
}
printf("\n");
}
return ;
}