题意:给出矩形的左上和右下的坐标,在矩形中有n个木棒,木棒之间不会相交,然后给出木棒上下端点的横坐标,接着有m个玩具,给出玩具的坐标。输出木棒围成的区域中有玩具的个数。
思路:由于数据范围大,所以对有序的木棒二分,叉积判断点在木棒的哪端。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 5010;
struct point {
double x , y;
};
double Xmult(point a , point b , point c) {
return (b.x-a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x);
}
point P[maxn] , Pu[maxn] , Pd[maxn];
int sum[maxn];
int n , m , k;
void Bin(point X) {
int l , r , ans;
double tmp;
l = 0; r = n+1;
while(l <= r) {
int mid = (l+r)/2;
tmp = Xmult(X , Pu[mid] , Pd[mid]);
if(tmp < 0) {
ans = mid;
//printf("ans = %d\n",ans);
r = mid-1;
} else l = mid+1;
}
//printf("id = %d\n",ans);
sum[ans-1] ++;
}
int main() {
double x1 , y1 , x2 , y2;
int i , j;
while(~scanf("%d",&n)) {
if(!n) break;
scanf("%d%lf%lf%lf%lf",&m,&x1,&y1,&x2,&y2);
for(i = 1 ; i <= n ; i ++) {
scanf("%lf%lf",&Pu[i].x,&Pd[i].x);
Pu[i].y = y1;
Pd[i].y = y2;
}
Pu[0].x = x1;Pu[0].y=y1;
Pd[0].x = x1;Pd[0].y=y2;
Pu[n+1].x = x2;Pu[n+1].y=y1;
Pd[n+1].x = x2;Pd[n+1].y=y2;
for(i = 0 ; i < m ; i ++) scanf("%lf%lf",&P[i].x,&P[i].y);
k = 0;
memset(sum , 0 , sizeof(sum));
for(i = 0 ; i < m ; i ++) Bin(P[i]);
for(i = 0 ; i <= n ; i ++) printf("%d: %d\n",i,sum[i]);
printf("\n");
}
}