<题目链接>

题目大意:

给出矩形4个点和n个挡板俩顶点的位置,这n个挡板将该矩形分成 n+1块区域,再给你m个点的坐标,然你输出每个区域内有几个点。

解题思路:

用叉乘即可简单判断点与直线的位置关系,对每一个点,遍历挡板,直到找到符合的区间为止。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. const int maxn=+;
  8. int map[maxn+];
  9. int n,m;
  10.  
  11. struct Point
  12. {
  13. int x,y;
  14. Point(int a=,int b=):x(a),y(b){}
  15. Point operator - (const Point&b)const
  16. {
  17. return Point(x-b.x,y-b.y);
  18. }
  19.  
  20. int operator ^(const Point&b)const //重载叉乘符号
  21. {
  22. return x*b.y-y*b.x; //两向量叉乘公式
  23. }
  24. };
  25.  
  26. struct Line
  27. {
  28. Point a,b;
  29. Line(){}
  30. Line(Point m,Point n):a(m),b(n){}
  31. };
  32. Line arr[maxn+];
  33. Point brr[maxn+];
  34. // 求叉积
  35. int Mulcross(Point p0,Point p1,Point p2)
  36. {
  37. return (p1-p0)^(p2-p0); //计算
  38. } //不一定是这个顺序计算,只要保证两个向量有共同的顶点,和下面的>0判断相应改变即可,你可以以p0或p2为顶点
  39.  
  40. void juge(Point goal)
  41. {
  42. // 从第一条线向后遍历,如果点在该线左面,则该下标total++
  43. for(int i=;i<n;i++)
  44. {
  45. //这里根据叉乘判断点与直线的方向,主要的依据就是两个向量叉乘的右手定则,若朝平面下,则<0,若朝平面上则>0,然后自己画图理解一下
  46. if(Mulcross(arr[i].b,goal,arr[i].a)>)continue; // 如果点在挡板的右边,则继续看下一个区间是否符合
  47. else
  48. {
  49. map[i]+=; //如果点在挡板的左边,那么当前区间点的个数+1
  50. return;
  51. }
  52. }
  53. // 找到最后都没找到,就是在最后一个区域
  54. map[n]+=;
  55. }
  56.  
  57. int main()
  58. {
  59. int ncase=;
  60. while(scanf("%d",&n)!=EOF,n)
  61. {
  62. memset(map,,sizeof(map));
  63. int marx1,mary1,marx2,mary2;
  64. scanf("%d%d%d%d%d",&m,&marx1,&mary1,&marx2,&mary2);
  65. for(int i=;i<n;i++) //挡板的坐标
  66. {
  67. int x1,x2;
  68. scanf("%d %d",&x1,&x2);
  69. arr[i].a.x=x1;arr[i].a.y=mary1;
  70. arr[i].b.x=x2;arr[i].b.y=mary2;
  71. }
  72.  
  73. for(int i=;i<m;i++) //点的坐标
  74. {
  75. int a,b;
  76. scanf("%d %d",&a,&b);
  77. juge(Point(a,b)); //找到点的区间
  78. }
  79.  
  80. for(int i=;i<=n;i++)
  81. {
  82. printf("%d: %d\n",i,map[i]);
  83. }
  84. printf("\n");
  85. }
  86. return ;
  87. }

二分查找的方法

<转载于>

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <map>
  7. #include <vector>
  8. #include <set>
  9. #include <string>
  10. #include <math.h>
  11.  
  12. using namespace std;
  13. struct Point
  14. {
  15. int x,y;
  16. Point(){}
  17. Point(int _x,int _y)
  18. {
  19. x = _x;y = _y;
  20. }
  21. Point operator -(const Point &b)const //向量相减
  22. {
  23. return Point(x - b.x,y - b.y);
  24. }
  25. int operator *(const Point &b)const //向量相乘
  26. {
  27. return x*b.x + y*b.y;
  28. }
  29. int operator ^(const Point &b)const
  30. {
  31. return x*b.y - y*b.x;
  32. }
  33. };
  34. struct Line
  35. {
  36. Point s,e;
  37. Line(){}
  38. Line(Point _s,Point _e)
  39. {
  40. s = _s;e = _e;
  41. }
  42. };
  43.  
  44. int xMult(Point p0,Point p1,Point p2) //计算p0p1 X p0p2
  45. {
  46. return (p1-p0)^(p2-p0);
  47. }
  48.  
  49. const int MAXN = ;
  50. Line line[MAXN];
  51. int ans[MAXN];
  52.  
  53. int main()
  54. {
  55. int n,m,x1,y1,x2,y2;
  56. bool first = true;
  57. while(scanf("%d",&n) == && n)
  58. {
  59. if(first)first = false;
  60. else printf("\n");
  61. scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
  62. int Ui,Li;
  63. for(int i = ;i < n;i++)
  64. {
  65. scanf("%d%d",&Ui,&Li);
  66. line[i] = Line(Point(Ui,y1),Point(Li,y2));
  67. }
  68. line[n] = Line(Point(x2,y1),Point(x2,y2));
  69. int x,y;
  70. Point p;
  71. memset(ans,,sizeof(ans));
  72. while( m-- )
  73. {
  74. scanf("%d%d",&x,&y);
  75. p = Point(x,y);
  76. int l = ,r = n;
  77. int tmp;
  78. while( l <= r)
  79. {
  80. int mid = (l + r)/;
  81. if(xMult(p,line[mid].s,line[mid].e) < )
  82. {
  83. tmp = mid;
  84. r = mid - ;
  85. }
  86. else l = mid + ;
  87. }
  88. ans[tmp]++;
  89. }
  90. for(int i = ; i <= n;i++)
  91. printf("%d: %d\n",i,ans[i]);
  92. }
  93. return ;
  94. }

2018-08-01

POJ 2318 TOYS (叉乘判断)的更多相关文章

  1. POJ 2318 TOYS 利用叉积判断点在线段的那一侧

    题意:给定n(<=5000)条线段,把一个矩阵分成了n+1分了,有m个玩具,放在为位置是(x,y).现在要问第几个位置上有多少个玩具. 思路:叉积,线段p1p2,记玩具为p0,那么如果(p1p2 ...

  2. POJ 2318 TOYS(叉积+二分)

    题目传送门:POJ 2318 TOYS Description Calculate the number of toys that land in each bin of a partitioned ...

  3. poj 2318 TOYS (二分+叉积)

    http://poj.org/problem?id=2318 TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 101 ...

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

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

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

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

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

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

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

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

  8. TOYS POJ 2318 计算几何 叉乘的应用

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15060   Accepted: 7270 Description Calc ...

  9. POJ 2318 TOYS (计算几何,叉积判断)

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8661   Accepted: 4114 Description ...

随机推荐

  1. Pytorch中的torch.cat()函数

    cat是concatnate的意思:拼接,联系在一起. 先说cat( )的普通用法 如果我们有两个tensor是A和B,想把他们拼接在一起,需要如下操作: C = torch.cat( (A,B),0 ...

  2. Linux下创建C函数库

    http://blog.163.com/hitperson@126/blog/static/130245975201151552938133 http://blog.sina.com.cn/s/blo ...

  3. proxysql 系列~审核功能

    一 简介:今天我们来探讨下具体的审核功能 二 平台审计功能 一 proxysql 设置  set mysql-eventslog_filename = '/data/ProxySQL/log/sql. ...

  4. joomla安装

    最开始我以为是我电脑反映慢.傻傻的等了很久.因为我在sae上面初始化成功了.只是差两张表而已.等了很久很久.也试了好几次.反正就是卡在创建数据表那里.突然我想到在sae初始化数据库的时候有两种模式In ...

  5. maven插件的使用

    maven插件官网: https://maven.apache.org/plugins/index.html 1.JDK插件的使用 <build> <plugins> < ...

  6. Jetson tk1 hash sum mismatch

    sudo apt-get update遭遇Hash Sum Mismatch 修改DNS服务器地址: sudo gedit /etc/resolv.conf 解决办法: 在装有goagent的情况下: ...

  7. ubuntu 14.04界面美化

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABVYAAAMACAIAAABAXKuVAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Xu

  8. Oracle11g的database 和client的区别是什么?

    由于工作需要,刚开始接触oracle数据库,完全小白,下载的时候看到有database和client两种类型可供下载,一时不知如何是好,于是网上询问得知其中区别,在此记录一下自己的无知. “datab ...

  9. svn使用openldap验证apache访问方式

    启用svn服务器的sasl验证机制 1.安装cyrus-sasl认证包 # yum install -y *sasl* # rpm -qa|grep sasl cyrus-sasl-2.1.23-15 ...

  10. FreeSWITCH Git版本管理

    由于测试FreeSWITCH不同版本的需要,研究了下Git的使用,通过Git来管理所有的版本,方便了测试.以下就总结下具体的使用方法: 其中:git clone ..是现在git仓库:git tag ...