本题利用了二分的思想,通过计算几何中通过向量(x2-x1)*(y2-y1)-(x3-x1)*(y3-y1)如果它小于零,则这个点在挡板的右边,大于零则在挡板左边。最后注意输出格式就好了,就是一道计算几何的基础题,小心点写应该问题不大
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int m,n;
struct node{
int x2;
int x1;
};
node a[5005];
int num[5005];
int xx1,yy1,xx2,yy2;
int solve(int x,int y){
int lb=-1, ub=n+1;
while(ub-lb>1){
int mid=(lb+ub)/2;
if((a[mid].x1-a[mid].x2)*(y-yy2)
-(x-a[mid].x2)*(yy1-yy2)>0){
ub=mid;
}else{
lb=mid;
}
}
//cout<<lb<<endl;
return lb;
}
int main()
{
while(cin>>n&&n!=0){
cin>>m;
cin>>xx1>>yy1>>xx2>>yy2;
a[0].x1=xx1;
a[0].x2=xx1;
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].x1,&a[i].x2);
//cin>>a[i].x1>>a[i].x2;
}
a[n+1].x1=xx2;
a[n+1].x2=xx2;
int x,y;
memset(num,0,sizeof(num));
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
//cin>>x>>y;
int k=solve(x,y);
num[k]++;
}
for(int i=0;i<=n;i++){
cout<<i<<": "<<num[i]<<endl;
}
cout<<endl;
}
return 0;
}