poj2318 TOYS(计算几何+叉积+二分)

poj2318

题目

就是给了一个矩形,给了几条竖线分割,有m个点,问m个点的分布。

思路

用叉积来判断点在线的左边还是右边,(貌似小于零是在左边),然后就是用二分了。

代码

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

const int maxn=5010;

struct Point
{
    int x,y;
    Point() {}
    Point(int _x,int _y)
    {
        x=_x;
        y=_y;
    }
    Point operator -(const Point &b)const
    {
        return Point(x - b.x,y - b.y);
    }
    int operator *(const Point &b)const
    {
        return x*b.x + y*b.y;
    }
    int operator ^(const Point &b)const
    {
        return x*b.y - y*b.x;
    }
};

struct Line
{
    Point s,e;
    Line() {}
    Line(Point _s,Point _e)
    {
        s = _s;
        e = _e;
    }
};

int xmult(Point p0,Point p1,Point p2)
{
    return (p1-p0)^(p2-p0);
}

int n,m,x1,y1,x2,y2;

Line line[maxn];
Point point[maxn];
int ans[maxn];

int main()
{
    while(scanf("%d",&n)&&n)
    {
        scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2);
        for(int i=1; i<=n; i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            line[i]=Line(Point(a,y1),Point(b,y2));
        }
        line[0]=Line(Point(x1,y1),Point(x1,y2));
        line[n+1]=Line(Point(x2,y1),Point(x2,y2));
        for(int i=0; i<m; i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            point[i]=Point(a,b);
        }
        memset(ans,0,sizeof(ans));
        for(int i=0; i<m; i++)
        {
            int l=0;
            int r=n+1;
            int mid;
            int temp;
            while(l<=r)
            {
                mid=(l+r)>>1;
                if(xmult(point[i],line[mid].s,line[mid].e)<0)
                {
                    temp=mid;
                    r=mid-1;
                }
                else
                    l=mid+1;
            }
            ans[temp-1]++;
        }
        for(int i=0; i<=n; i++)
            printf("%d: %d\n",i,ans[i]);
        printf("\n");
    }

}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pibaixinghei/article/details/52369666
上一篇hdu5534 Partial Tree(dp)
下一篇poj3304 Segments(计算几何+直线相交)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭