https://vjudge.net/problem/POJ-2318
int n,m,x1,y1,x2,y2;
int s[5010];
struct line{int a,b,c,d;}w[5010];
struct point{int x,y;}v[5010];
int get(int x1,int y1,int x2,int y2,int x,int y)
{
if((x1-x2)*(y1-y2)!=0)
{
//本来不理解为什么斜率正负情况一样
//应为乘以负数要变号
if(((y-y2)*(x1-x2)-(y1-y2)*(x-x2))>0)return 1;
else return -1;
}
else
{
if(x<x1)return 1;
else return -1;
}
}
int main()
{
while(~scanf("%d",&n)&&n)
{
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);s[0]=0;
for(int i=1;i<=n;i++)scanf("%d%d",&w[i].a,&w[i].c),s[i]=0,w[i].b=y1,w[i].d=y2;
for(int i=1;i<=m;i++)scanf("%d%d",&v[i].x,&v[i].y);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(j==1)
{
if(get(w[j].a,w[j].b,w[j].c,w[j].d,v[i].x,v[i].y)==1)
{
s[0]++;break;
}
}
if(j==n)
{
if(get(w[j].a,w[j].b,w[j].c,w[j].d,v[i].x,v[i].y)==-1)
{
s[n]++;break;
}
}
if(get(w[j].a,w[j].b,w[j].c,w[j].d,v[i].x,v[i].y)==1&&get(w[j-1].a,w[j-1].b,w[j-1].c,w[j-1].d,v[i].x,v[i].y)==-1)
{
s[j-1]++;
break;
}
}
}
for(int i=0;i<=n;i++)printf("%d: %d\n",i,s[i]);
printf("\n");
}
return 0;
}