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

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

POJ2318---TOYS (基础计算几何:叉积应用)

【题目来源】:https://vjudge.net/problem/POJ-2318 【题意】 给出一个矩形的柜子,这个柜子有n个隔板,小孩手里有m个布偶,将娃娃都扔进去,问,被隔板分离出来的每个...

poj 2318 TOYS(计算几何:求叉积)

给出一个被n条线段分割的矩形 有m次询问,每次找到这个点所属的四边形 用二分的方法,找到对左侧线段叉积为正,右侧线段叉积为负的情况 直接套模板,代码如下: /* ***************...

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

POJ 2318 TOYS :http://poj.org/problem?id=2318 Language: Default TOYS Tim...
  • PNAN222
  • PNAN222
  • 2016年05月21日 10:55
  • 291

POJ2318_TOYS( 几何/叉积运用)

解题报告 给你一个盒子,然后很多隔板,以及toys的坐标,问你每个隔板里有多少个玩具。...

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

题目链接:POJ 2318 TOYS 【题意】
  • RaynX
  • RaynX
  • 2014年05月05日 10:26
  • 475

POJ 2318 TOYS(叉积+二分)

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

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

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

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

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

poj 2318 TOYS 【判断区域里面点的个数】 【二分+叉积判断】

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12509   Accepted: 6053 ...

poj 2318 TOYS 二分+叉积

给出一个矩形抽屉,然后有n个板子放在其中,连接上下底。给出m个玩具的坐标(视作点), 问n+1个区间内,每个区间中有多少玩具。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj2318 TOYS(计算几何+叉积+二分)
举报原因:
原因补充:

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