真的算是入门题目啊。。。。
就这样还折腾了一个小时快,而且三个点叉积竟然是lxh告我的,自己看半天没懂为什么这样做。。。。。
努力学计算几何吧,考前也就这个星期二四五看看信息。。。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int n,cnt[5005],m,x1,y1,x2,y2;
struct point
{
int x,y;
};
struct Line
{
point a,b;
}line[5005];
int cross(point x,point x1,point x2)//等价于向量(x2-x)与向量(x1-x)叉乘
{
return(x.x-x2.x)*(x1.y-x2.y)-(x1.x-x2.x)*(x.y-x2.y);
}
void work(point x)
{
int l=0,r=n-1;
while(l<r)
{
int mid=(l+r)/2;
if(cross(x,line[mid].a,line[mid].b)>0)
l=mid+1;
else
r=mid;
}
if(cross(x,line[l].a,line[l].b)<0)
cnt[l]++;
else
cnt[l+1]++;
}
int main()
{
while(scanf("%d",&n)&&n!=0)
{
memset(cnt,0,sizeof(cnt));
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
for(int i=0;i<n;i++)
{
int a1,a2;
scanf("%d%d",&a1,&a2);
line[i].a.x=a1;
line[i].a.y=y1;
line[i].b.x=a2;
line[i].b.y=y2;
}
point x;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x.x,&x.y);
work(x);
}
for(int i=0;i<=n;i++)
printf("%d: %d\n",i,cnt[i]);
printf("\n");
}
return 0;
}