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

原创 2016年08月30日 15:24:48

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

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ 2318 TOYS + 2398 Toy Storage(计算几何叉积)

POJ 2318 TOYS :http://poj.org/problem?id=2318 Language: Default TOYS Tim...

二分+叉积 apio2011 陈可卿 计算几何的一道简单题 poj2318 兼集训总结

这两天是省选,作为高一实在没什么竞争力,但奥特曼依旧杀入省队。 apio讲这道题的时候,我一下灵光一闪,想到了二分,之前除了在nlogn的最长上升子序列用过一次,就再也没用过,只知道跟单调性有关,a...

poj 2318 TOYS 二分+叉积

给出一个矩形抽屉,然后有n个板子放在其中,连接上下底。给出m个玩具的坐标(视作点), 问n+1个区间内,每个区间中有多少玩具。

POJ 2318 TOYS(叉积+二分)

题目链接:Click here~~ 题意: 有一个矩形的盒子,中间插了n个挡板,将盒子分成n+1个区域,然后给m个点,问最后每个区域落下多少个点。(点不会落到挡板上) 解题思路:...

【解题报告】 POJ 2318 TOYS -- 判断点在某个梯形内 叉积 + 二分

题目连接: POJ 2318 题目大意:给一个长方体盒子,中间竖直插上若干隔板,将盒子分成了若干区域,现在往盒子里丢玩具,问最后各个区域内含有多少玩具。 这道题有两个思路:           ...

POJ 2318 TOYS(叉积+二分or暴力)

题目链接:POJ 2318 TOYS 【题意】
  • RaynX
  • RaynX
  • 2014-05-05 10:26
  • 446

poj 2318 toys 计算几何+二分

poj 2318 toys 计算几何+二分

POJ 2318 || TOYS (叉积判断左右位置进行折半查找

给你一个矩形的左上角和右下角的坐标,以及从左到右把矩形划分为若干个空间的线段。 这些线段都给出X的坐标,所以线段的两端坐标为,(Ui,Y1)  ( Li,Y2). 在给出M个点的坐标,求每个空间内...
  • FXXKI
  • FXXKI
  • 2015-03-23 23:42
  • 306

poj(2318)——TOYS(叉积的简单应用)

第一道计算几何题。。 题意: 在一个长方形盒子中被线段划分成了几段区域,然后每段区域中都有一些物品,让你判断在每个区域中分别有几个物品。 叉积的简单应用: 这就要用到向量叉积。叉积的一个非常重要的性...

poj 2318 TOYS(叉积的应用)

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7307   Accepted:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)