• 题目传送门:poj 2398 Toy Storage

  • 题目大意:一个长方形的箱子,里面有一些隔板,每一个隔板都可以纵切这个箱子。隔板将这个箱子分成了一些隔间。向其中扔一些玩具,每个玩具有一个坐标,求有\(t​\)个玩具的隔间数(对\(t>0​\)都要输出)。

  • 题目分析:涉及到计算几何的知识是求点在线的哪一侧。可以利用叉积来做。取点\(A\)到隔板的上端点\(B\)的向量\(\vec{AB}\)叉乘点\(A\)到隔板的下端点\(C\)的向量\(\vec{AC}\)。叉积的公式\(\vec a\times \vec b=|\vec a||\vec b|sin(\vec a,\vec b)\)里是有一个\(sin(\vec a,\vec b)\)的。可见若点\(A\)在\(BC\)的左侧,\((\vec{AB},\vec{AC})>\pi\)(右手法则的角度),故\(sin(\vec{AB},\vec{AC})<0\),\(\vec{AB}\times \vec{AC}<0\)。反之,点\(A\)在\(BC\)右侧,\(\vec{AB}\times \vec{AC}>0\)。这样就可以二分求每个玩具在哪个隔间里。

  • #include <cstdio>
    #include <cmath>
    #include <ctime>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    typedef long long LL;
    const int maxn = 1000; using namespace std; struct tPoint
    {
    int x, y;
    }; struct tCard
    {
    tPoint a, b;
    bool operator<(const tCard& y) const
    {
    if(a.x==y.a.x)
    return b.x<y.b.x;
    return a.x<y.a.x;
    }
    };
    tCard card[maxn+10]; int Multi(tPoint p1, tPoint p2, tPoint p0)
    {
    return (p1.x-p0.x) * (p2.y-p0.y) - (p2.x-p0.x) * (p1.y-p0.y);
    } int bSearch(tPoint p, int n)
    {
    int l=1, r=n;
    while(l<=r)
    {
    int mid = (l+r)/2;
    if(Multi(card[mid].a, card[mid].b, p)>0)
    l = mid+1;
    else
    r = mid-1;
    }
    return l;
    } int num[maxn+10];//partition[i]含的玩具数
    int parti[maxn+10];//含i个玩具的partition数 int main()
    {
    int n, m, x1, y1, x2, y2;
    while(scanf("%d", &n), n)
    {
    scanf("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);
    for(int i=1,u,l; i<=n; i++)
    {
    scanf("%d%d", &u, &l);
    card[i] = (tCard){(tPoint){u,y1},(tPoint){l,y2}};
    }
    card[n+1] = (tCard){(tPoint){x1,y1},(tPoint){x1,y2}};
    card[n+2] = (tCard){(tPoint){x2,y1},(tPoint){x2,y2}};
    sort(card+1, card+1+n+2); memset(num, 0, sizeof(num));
    for(int i=1; i<=m; i++)
    {
    tPoint p;
    scanf("%d%d", &p.x, &p.y);
    int part = bSearch(p, n+2) - 1;
    num[part]++;
    } memset(parti, 0, sizeof(parti));
    for(int i=1; i<=n+1; i++)
    parti[num[i]]++; printf("Box\n");
    for(int i=1; i<=maxn; i++)
    {
    if(parti[i])
    printf("%d: %d\n", i, parti[i]);
    }
    }
    return 0;
    }

poj 2398 Toy Storage(计算几何)的更多相关文章

  1. poj 2398 Toy Storage(计算几何 点线关系)

    Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4588   Accepted: 2718 Descr ...

  2. POJ 2398 Toy Storage(计算几何)

    题意:给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数. 题解:通过斜率判断一个点是否在两条线段之间. /** 通过斜率比较点是否在两线段之 ...

  3. POJ 2318 TOYS && POJ 2398 Toy Storage(几何)

    2318 TOYS 2398 Toy Storage 题意 : 给你n块板的坐标,m个玩具的具体坐标,2318中板是有序的,而2398无序需要自己排序,2318要求输出的是每个区间内的玩具数,而231 ...

  4. POJ 2398 Toy Storage(计算几何,叉积判断点和线段的关系)

    Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3146   Accepted: 1798 Descr ...

  5. 2018.07.04 POJ 2398 Toy Storage(二分+简单计算几何)

    Toy Storage Time Limit: 1000MS Memory Limit: 65536K Description Mom and dad have a problem: their ch ...

  6. POJ 2398 - Toy Storage 点与直线位置关系

    Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5439   Accepted: 3234 Descr ...

  7. 简单几何(点与线段的位置) POJ 2318 TOYS && POJ 2398 Toy Storage

    题目传送门 题意:POJ 2318 有一个长方形,用线段划分若干区域,给若干个点,问每个区域点的分布情况 分析:点和线段的位置判断可以用叉积判断.给的线段是排好序的,但是点是无序的,所以可以用二分优化 ...

  8. 向量的叉积 POJ 2318 TOYS & POJ 2398 Toy Storage

    POJ 2318: 题目大意:给定一个盒子的左上角和右下角坐标,然后给n条线,可以将盒子分成n+1个部分,再给m个点,问每个区域内有多少各点 这个题用到关键的一步就是向量的叉积,假设一个点m在 由ab ...

  9. POJ 2398 Toy Storage (叉积判断点和线段的关系)

    题目链接 Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4104   Accepted: 2433 ...

随机推荐

  1. JVM的内存回收机制

    垃圾回收机制,简称gc.对堆与方法区的对象进行回收,因为java不像c需要编程人员手动clear,虚拟机通过垃圾回收算法,对堆与方法区的对象进行自动回收处理. 1.引用计数法(jvm没有采用,因为当两 ...

  2. 解决无法定位软件包 或 install net-tools

    解决无法定位软件包  或  install net-tools  当我们安装好Linux后,因为里面有很多功能服务没有安装(如ifconfig.vsftpd) 所以出现一些command  '**** ...

  3. Ubuntu--pip3 -V 问题

    问题原因:可能是因为重新下载或更新python版本的时候,将系统的‘软连接’破坏掉了 解决办法: 1.重新创建--软连接: 进入bin目录:cd /usr/bin 删除pip3连接:rm pip3 重 ...

  4. Java面向对象学习目录

    Java面向对象学习目录 以下为面向对象学习目录,有待补充的部分,我还会再后续的学习过程中加以补充与修改~ 一.面向对象编程思想 二.Java类及类中成员 属性 方法 构造器 代码块 内部类 面向对象 ...

  5. JAVA中的类不要使用$符的原因解析

    下面是在Java中标识符的定义 1.标识符由字母.数字.货币符号(¥.$等).连接符号(_等)组成.(这里的字母为Unicode字符集, 而不再局限于传统的26个英文字母.)2.标识符的首字符可以是字 ...

  6. Spring IOC初始化深度解析

    1.前言 本文是基于JAVA配置方法对Spring IOC进行分析,掌握Spring IOC初始化流程对于我们更好的使用Spring.学习Spring还是很有帮助的,本文所使用的的Spring版本为5 ...

  7. 【Android - 自定义View】之View的位置参数

    View是Android中所有控件的基类,不管是简单的Button和TextView,还是复杂的RelativeLayout和ListView,其基类都是View类:ViewGroup也继承了View ...

  8. json序列化反序列化Jackson相关注解

    1.@Transient @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性:如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则ORM框架 ...

  9. LeetCode 链表题 ( Java )

    leetcode 237. 删除链表中的节点 链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ 示例 : 输入: he ...

  10. React - 组件:类组件

    目录: 1. 类组件有自己的状态 2. 继承React.Component-会有生命周期和this 3. 内部需要一个render函数(类组件会默认调用render方法,但不会默认添加,需要手动填写r ...