POJ 2318 TOYS 计算几何 入门题 叉积 + 二分

来源:互联网 发布:手机淘宝里输入链接 编辑:程序博客网 时间:2024/05/16 11:31

第一题计算几何,1A,好开心哦。

View Code
#include<stdio.h>#include<string.h>#include<math.h>struct point{    int x, y;};int up[5007],down[5007];;int n, m;point toy[5007];point a, b;int ans[5007];int cross(point o, point a, point b){    return ((a.x-o.x)*(b.y-o.y)-(a.y-o.y)*(b.x-o.x));}int find(point key){    int l , r, mid;    l = 0; r = n+1;    point upp, downn;    upp.y = a.y;    downn.y = b. y;    while(l <= r)    {        mid = (l + r) >> 1;        upp.x = up[mid];        downn.x = down[mid];        if(cross(downn, upp, key) > 0 ) r = mid - 1;        else l = mid + 1;    }    return l;}int main(){    int i, j;    while( ~scanf("%d", &n) && n)    {        scanf("%d", &m);        scanf("%d%d%d%d",&a.x, &a.y, &b.x, &b.y);        up[0] = down[0] = a.x;        up[n+1] = down[n+1] = b.x;        for(i = 1; i <= n; i++)            scanf("%d%d",&up[i], &down[i]);        memset(ans, 0, sizeof(ans));        for(i=1;i<=m;i++)        {            scanf("%d%d", &toy[i].x, &toy[i].y);            int index = find(toy[i]);            ans[index-1]++;        }        for(i=0;i<=n;i++)            printf("%d: %d\n",i, ans[i]);        printf("\n");    }    return 0;}