关闭

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

33人阅读 评论(0) 收藏 举报

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");
    }

}
0
0
猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18237次
    • 积分:1633
    • 等级:
    • 排名:千里之外
    • 原创:155篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条