poj 2318 叉积的应用+二分

标签: 叉积
2416人阅读 评论(0) 收藏 举报
分类:


Description

Calculate the number of toys that land in each bin of a partitioned toy box.
Mom and dad have a problem - their child John never puts his toys away when he is finished playing with them. They gave John a rectangular box to put his toys in, but John is rebellious and obeys his parents by simply throwing his toys into the box. All the toys get mixed up, and it is impossible for John to find his favorite toys.

John's parents came up with the following idea. They put cardboard partitions into the box. Even if John keeps throwing his toys into the box, at least toys that get thrown into different bins stay separated. The following diagram shows a top view of an example toy box.

For this problem, you are asked to determine how many toys fall into each partition as John throws them into the toy box.

Input

The input file contains one or more problems. The first line of a problem consists of six integers, n m x1 y1 x2 y2. The number of cardboard partitions is n (0 < n <= 5000) and the number of toys is m (0 < m <= 5000). The coordinates of the upper-left corner and the lower-right corner of the box are (x1,y1) and (x2,y2), respectively. The following n lines contain two integers per line, Ui Li, indicating that the ends of the i-th cardboard partition is at the coordinates (Ui,y1) and (Li,y2). You may assume that the cardboard partitions do not intersect each other and that they are specified in sorted order from left to right. The next m lines contain two integers per line, Xj Yj specifying where the j-th toy has landed in the box. The order of the toy locations is random. You may assume that no toy will land exactly on a cardboard partition or outside the boundary of the box. The input is terminated by a line consisting of a single 0.

Output

The output for each problem will be one line for each separate bin in the toy box. For each bin, print its bin number, followed by a colon and one space, followed by the number of toys thrown into that bin. Bins are numbered from 0 (the leftmost bin) to n (the rightmost bin). Separate the output of different problems by a single blank line.

Sample Input

5 6 0 10 60 0
3 1
4 3
6 8
10 10
15 30
1 5
2 1
2 8
5 5
40 10
7 9
4 10 0 10 100 0
20 20
40 40
60 60
80 80
 5 10
15 10
25 10
35 10
45 10
55 10
65 10
75 10
85 10
95 10
0

Sample Output

0: 2
1: 1
2: 1
3: 1
4: 0
5: 1

0: 2
1: 2
2: 2
3: 2
4: 2


通过结果的正负判断两矢量之间的顺逆时针关系
若 a x b > 0表示a在b的顺时针方向上
若 a x b < 0表示a在b的逆时针方向上
若 a x b == 0表示a在b共线,但不确定方向是否相同

记玩具在点p0,某块板的上边点是p1,下边点是p2,p2p1(向量)×p2p0>0表示p0在p1p2的左面,<0表示在右面。接下来就是用二分法找出每个点所在的分区。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<string>
#include<algorithm>
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
int n,m,xx,yy,x2,y2;
struct Line
{
    int u,l;
}line[5010];
int toy[5010];
bool isplace(int x,int y,int u,int l)
{
    if((x-l)*(yy-y2)-(y-y2)*(u-l)<0)
        return true;//左
    return false;
}
int binarysearch(int x,int y)
{
    int l=0,r=n;
    while(l<r)
    {
        int mid=(l+r)/2;
        if(isplace(x,y,line[mid].u,line[mid].l))
            r=mid;
        else
            l=mid+1;
    }
    return l;
}
int main()
{
    bool flag=0;
    while(cin>>n)
    {
        if(n==0)
            return 0;
        if(flag)
            cout<<endl;
        else
            flag=1;
        scanf("%d%d%d%d%d",&m,&xx,&yy,&x2,&y2);
        for(int i=0;i<=n-1;i++)
            scanf("%d%d",&line[i].u,&line[i].l);
        memset(toy,0,sizeof(toy));
        for(int i=0;i<=m-1;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            toy[binarysearch(a,b)]++;
        }
        for(int i=0;i<=n;i++)
            cout<<i<<": "<<toy[i]<<endl;
    }
    return 0;
}


查看评论

poj 2318 TOYS 二分+叉积

给出一个矩形抽屉,然后有n个板子放在其中,连接上下底。给出m个玩具的坐标(视作点), 问n+1个区间内,每个区间中有多少玩具。...
  • yskyskyer123
  • yskyskyer123
  • 2016年08月03日 20:59
  • 608

poj2318TOYS【二分+点与直线位置判断】

Language: Default TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12094   Ac...
  • R1986799047
  • R1986799047
  • 2015年08月27日 22:06
  • 770

POJ 2318 —— TOYS(叉积+二分)

题目:http://poj.org/problem?id=2318 题意就是给个矩形,然后n条不想交
  • hongrock
  • hongrock
  • 2014年06月11日 17:34
  • 490

poj 2318 TOYS(叉积+二分)

TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10292   Accepted...
  • WEYuLi
  • WEYuLi
  • 2014年08月05日 16:17
  • 455

Poj 2318 TOYS (叉积+二分)

好久没做计算几何了,随便找道题恢复下手感,明显感觉写复杂了。。。。 应该是最后一道用vc6.0敲的题了,下一道改用codeblocks 题意:给定一个长方形箱子,中间有n条线段,将其分为n+1个区...
  • whyorwhnt
  • whyorwhnt
  • 2013年09月12日 22:15
  • 659

POJ2318-toys(计算几何基础+二分)

题目:http://poj.org/problem?id=2318 题目大意:给定一个矩形和一些线段,线段将矩形分割为从左至右的若干部分,之后给出一些玩具的坐标,求每个部分中玩具的数量 题解: ...
  • cccccwb
  • cccccwb
  • 2016年02月24日 16:24
  • 249

POJ 2318 TOYS(叉积+二分)

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

POJ - 2318 TOYS 二分+叉积

给出n条线段把一个区域分割成不同的地区,之后给你m个点,求每个地区有几个点。 线段是从左到右给出的,所以不用做什么处理。 对于每一个点我们直接二分,即可。 #include #includ...
  • Little_boy_z
  • Little_boy_z
  • 2017年10月29日 12:23
  • 83

POJ 2318 TOYS 二分+叉积

入门计算几何 判断在哪个区域内只需看跟某条线的叉积即可 可以保证单调性,所以可以进行二分 #include #include #include #include #i...
  • sdj222555
  • sdj222555
  • 2013年10月24日 22:24
  • 591

poj 2318 TOYS 二分+叉积

题解 : 我们发现这个题目的隔板是按照x从小到大排列的,所以当一个点在某个隔板的左边时它一定也在它右边隔板的左边这样的话这个题在第几个搁板后面就满足了二分性质 然后我们就可以二分答案,看看每个点在哪两...
  • zhelong3205
  • zhelong3205
  • 2017年09月14日 20:00
  • 54
    个人资料
    持之以恒
    等级:
    访问量: 13万+
    积分: 4250
    排名: 8897
    赞助一下
    如果您觉得我的文章对您有帮助的话,不妨小额赞助一下,激励我写出更多的好文章,谢谢大家!

    以下是我的支付宝和微信账户