TOYS

题意:给定一个如上的长方形箱子,中间有n条线段,将其分为n+1个区域,给定m个玩具的坐标,统计每个区域中的玩具个数。

思路:这道题很水,只是要知道会使用叉乘来表示点在线的上面还是下面;
当a.Xmult(b,c) < 0时,表示在线的上面。之后就是二分的时候,不能直接使用mid来ans[mid]++;

因为只是确定点在这条线的两边,到底是哪一边,具体还要用tmp来判断;(模板题)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define MS0(a) memset(a,0,sizeof(a))
const int MAXN = 5050;
struct point{int x,y;point(){}point(int _x,int _y){x = _x; y = _y;}long long operator *(const point &b)const{// 叉乘return (1LL*x*b.y - 1LL*y*b.x);}point operator -(const point &b)const{return point(x - b.x,y - b.y);}long long dot(const point &b){    //点乘return 1LL*x*b.x + 1LL*y*b.y;}double dist(const point &b){return sqrt(1LL*(x-b.x)*(x-b.x)+1LL*(y-b.y)*(y-b.y));}long long dist2(const point &b){return 1LL*(x-b.x)*(x-b.x)+1LL*(y-b.y)*(y-b.y);}double len(){return sqrt(1LL*x*x+1LL*y*y);}double point_to_segment(point b,point c)//点a到“线段” bc的距离a.point_to_segment(b,c);
    {point v[4];v[1] = {c.x - b.x,c.y - b.y};v[2] = {x - b.x,y - b.y};v[3] = {x - c.x,y - c.y};if(v[1].dot(v[2]) < 0) return v[2].len();if(v[1].dot(v[3]) > 0) return v[3].len();return fabs(1.*(v[1]*v[2])/v[1].len());}long long Xmult(point b,point c){   // 当a->b与a->c顺时针转时,返回正;return (b-*this)*(c-*this);}void input(){scanf("%d%d",&x,&y);}
}p[MAXN];struct Line{point s,t;Line(){}Line(point _s,point _t){s = _s,t =_t;}
}line[MAXN];
int ans[MAXN];
int main()
{int n,m,i,j,x1,y1,x2,y2,kase = 0,U,L;while(scanf("%d",&n),n){MS0(ans);if(kase) puts("");else kase++;scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);for(i = 1;i <= n;i++){scanf("%d%d",&U,&L);line[i] = Line(point(U,y1),point(L,y2));}line[0] = Line(point(x1,y1),point(x1,y2));int x,y;for(i = 0;i < m;i++){scanf("%d%d",&x,&y);int l = 0, r = n,mid,tmp;while(l <= r){mid = l + r >> 1;if( point(x,y).Xmult(line[mid].s,line[mid].t) < 0) r = mid-1; //在线的上边else tmp = mid,l = mid+1;   //线下的点所在的区域才是改line的标号;
            }ans[tmp]++;}for(i = 0;i <= n;i++){printf("%d: %d\n",i,ans[i]);}}return 0;
}

View Code

转载于:https://www.cnblogs.com/hxer/p/5185149.html

poj 2318 TOYS相关推荐

  1. poj 2318 TOYS amp; poj 2398 Toy Storage (叉积)

    链接:poj 2318 题意:有一个矩形盒子,盒子里有一些木块线段.而且这些线段坐标是依照顺序给出的. 有n条线段,把盒子分层了n+1个区域,然后有m个玩具.这m个玩具的坐标是已知的,问最后每一个区域 ...

  2. AcWing 2983. 玩具 / POJ 2318.toys(计算几何基础、二分、判断点和直线的位置关系)

    计算几何基础题 题目大意就是一个盒子被分成了若干个区域,有m个小球,问每个区域里分别有多少个小球. 我们首先考虑暴力. 我们如何判断小球是否在一个区域内呢,我们发现一个小球在区域x,也就是说所有小于x ...

  3. [poj] 2318 TOYS || 判断点在多边形内

    原题 给出一个矩形玩具箱和其中隔板的位置,求每个玩具在第几个隔间内(保证没有在线上的玩具) 将玩具按x轴排序,记录当前隔板的编号,每次判断是否需要右移(左移)隔板(因为是有序的,所以移动次数左右不厚超 ...

  4. POJ - 2318 TOYS(叉积+二分)

    题目链接:点击查看 题目大意:给出一个盒子,由n条互不相交的线段分割为n+1个空格,现在有m个玩具的坐标,现在问每个空格内有多少个玩具 题目分析:利用叉积的性质判断点在直线的哪一侧: 以点在直线左侧为 ...

  5. A - TOYS POJ - 2318

    A - TOYS POJ - 2318 题意: 一个盒子中有n个隔板,分出n+1个空间(从左往右空间的编号分别是0-n),(隔板之间不会相交,且按照从左往右的顺序给出),现在给你m个坐标的物品,问盒子 ...

  6. 【POJ - 2318】TOYS(计算几何,叉积判断点与直线位置关系,二分)

    题干: Calculate the number of toys that land in each bin of a partitioned toy box.  Mom and dad have a ...

  7. A - TOYS(POJ - 2318) 计算几何的一道基础题

    Calculate the number of toys that land in each bin of a partitioned toy box. 计算每一个玩具箱里面玩具的数量 Mom and ...

  8. 寻找区域中有几个点 叉乘+二分 poj 2318

    题目来源:http://poj.org/problem?id=2318 一个 矩阵 被分成多个 区域, 然后输入 多个点, 输出 每个区域点的 个数. 当寻找点 落在某个区域时, 用二分法. #inc ...

  9. POJ 计算几何专项训练(1) 【2318】【2398】【3304】【2653】【1556】【1066】...

    POJ 2318 TOYS 题意是在一个大矩形里有n条分割线把矩形分割成n+1部分.再给出一些玩具的坐标.要求统计每个部分内有多少个玩具. 具体做法就是二分求解出当前玩具右方的第一条线.这可以用叉积判 ...

最新文章

  1. 调试视频网页js脚本的方法
  2. Java程序运行纳秒级差值计算
  3. JAVA泛型知识(一)
  4. Oracle的package(包)
  5. CentOS7下解决yum install mysql-server没有可用包的问题
  6. 魅族16s渲染图曝光:配备竖排双摄 无缘刘海屏
  7. 深度学习—写作Dataset时是否应该使用shuffle
  8. 服务器项目部署工具,通过工具SecureCRTPortable将项目部署到服务器上
  9. 分析ERP上线时可能存在的失误
  10. ThinkPHP空操作及命名空间
  11. UML用例图的画法详细介绍【软件工程】
  12. google吃豆子游戏
  13. C++设计模式--单例模式
  14. 给Matlab添加工具箱Toolbox的方法(有截图详细讲解)(R2019b)
  15. 27.FastAPI应用生产环境部署
  16. P/O矩阵、R/D矩阵、IPO图、C/U矩阵知识点
  17. GIF一下你也可以拍大片 微影戏程序
  18. subtext 安装PythonIDE -Anaconda
  19. ARP工作原理以及ARP欺骗、中间人攻击
  20. 条形码录入测试软件,ERP软件测试中条形码测试

热门文章

  1. 卸载linux grub rescue,Grub Rescue 修复方法
  2. 搭建etcd 3.4.15集群(详细教程,包括选举过程、数据备份和恢复)
  3. 华为n3计算机在哪里,在华为nova3i中连接电脑的两种方法介绍
  4. 【服务器】宝塔部署eoLinker开源版
  5. UVa673 - Parentheses Balance
  6. 如何画正太分布曲线_python scipy.stats实现各种常见的统计分布
  7. PAT乙级题解目录——更新ing
  8. jquery遍历节点
  9. C++中对象初始化赋值是否需要调用operator=函数
  10. 2019蓝桥杯C++B组 年号字串;完全二叉树的权值