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

第一题计算几何,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;
}

 

posted @ 2012-08-15 14:15  To be an ACMan  Views(189)  Comments(0)    收藏  举报