给定你个长方形,划分成n+1个区域,里面有m个玩具,求每个区域内有多少个玩具。
方法:叉积和二分法。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define eps 1e-8
using namespace std;
struct Point
{
int x, y;
Point(){}
Point(int x, int y):x(x), y(y){}
}up[5001], down[5001], p[5001];
typedef struct Point Vector;
//点-点=向量
Vector operator - (Point a, Point b)
{
return Vector(a.x-b.x, a.y-b.y);
}
//向量a与向量b的叉积
double Cross(Vector a, Vector b)
{
return a.x*b.y-a.y*b.x;
}
//二分查找
int binary(Point a, int n)
{
int L = 0, R = n, mid;
while ( L < R )
{
mid = (L+R)/2+1;//L + (R-L)/2;
//printf("L-%d-R-%d-mid-%d\n", L, R, mid);
int val = Cross( Vector(up[mid] - down[mid]), Vector(a - down[mid]) );
if (val < 0)
L = mid;
else
R = mid-1;
}
return L;
}
int main()
{
int n, m;
int x1, y1, x2, y2;
int ans[5001];
while (~scanf("%d", &n))
{
if (n==0)
break;
scanf("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);
for (int i=1; i<=n; i++)
{
scanf("%d%d", &up[i].x, &down[i].x);
up[i].y = y1;
down[i].y = y2;
}
for (int i=0; i<m; i++)
scanf("%d%d", &p[i].x, &p[i].y);
memset(ans, 0, sizeof(ans));
for (int i=0; i<m; i++)
ans[ binary(p[i], n) ] ++;
for (int i=0; i<=n; i++)
printf("%d: %d\n", i, ans[i]);
printf("\n");
}
return 0;
}