题目连接: http://poj.org/problem?id=2318     http://poj.org/problem?id=2398

两题类似的题目,2398是2318的升级版。

题目大概是说,有一个矩形的柜子,中间有一些隔板。告诉你每个隔板的坐标,还有一些玩具的坐标,统计玩具在哪个格子里。

这题的思路很简单,如果玩具在某个隔板的左边和右边叉乘的正负是不同的。如图:

图中点P在线段CD的左边,则向量PC和向量PD叉乘结果小于0。反之P在AB的左边,向量PA叉乘PB大于0。

因此利用这个性质以及排序好的线段列表,通过二分思想,可以快速知道点在哪个格子内。

代码:

  1. #include<stdio.h>
  2. #include<math.h>
  3. #define PI 3.14159265358979323846
  4. #define MAX(x,y) ((x)>(y)?(x):(y))
  5. #define MIN(x,y) ((x)<(y)?(x):(y))
  6. #define ABS(x) (((x)>0)?(x):(-(x)))
  7. #define SIGN(x) (((x)<0)?-1:1)
  8. #define EPS 0.000001/*精度控制*/
  9. #define N 5005
  10. /*坐标的定义*/
  11. typedef double coo;/*int*/
  12. /*点、向量*/
  13. typedef struct POINT
  14. {
  15. coo x,y;
  16. }point,vector;
  17. /*线段*/
  18. typedef struct SEGMENT
  19. {
  20. point p1,p2;/*p[2];*/
  21. }segment;
  22. /*判相等*/
  23. int is_equel(double a,double b)
  24. {
  25. double c=ABS(a-b);
  26. if(c<=EPS) return ;/*相等*/
  27. else return ;/*不相等*/
  28. }
  29. /*向量的减法p1-p2*/
  30. vector vector_minus(vector p1,vector p2)
  31. {
  32. vector p;
  33. p.x=p1.x-p2.x;
  34. p.y=p1.y-p2.y;
  35. return p;
  36. }
  37. /*向量叉乘*/
  38. double cross_product(vector p1,vector p2)
  39. {/*x1y2-x2y1*/
  40. return p1.x*p2.y-p1.y*p2.x;
  41. }
  42. int bijiao(segment s1,segment s2)/*比较两个线段的位置< */
  43. {
  44. if(s1.p1.x<s2.p1.x) return ;
  45. if(s1.p1.x==s2.p1.x&&s1.p2.x<s2.p2.x) return ;
  46. return ;
  47. }
  48. int Partition(segment r[],int low,int high)/*升序*/
  49. /*返回支点最终位置*/
  50. {
  51. segment x;/*类型具体*/
  52. if(low>high) return ;
  53. if(low==high) return low;
  54. x=r[low];
  55. while(low<high)
  56. {
  57. while(low<high&&bijiao(x,r[high])) high--; /*<*/
  58. if(low<high){r[low]=r[high];low++;}
  59. while(low<high&&bijiao(r[low],x)) low++; /*>*/
  60. if(low<high){r[high]=r[low];high--;}
  61. }
  62. r[low]=x;
  63. return low;
  64. }
  65. void Quick_sort(segment r[],int m,int n) /*排序从r[m]到r[n]*/
  66. {
  67. int i;
  68. if(m>=n) return;
  69. i=Partition(r,m,n);
  70. Quick_sort(r,m,i-);
  71. Quick_sort(r,i+,n);
  72. }
  73.  
  74. int BinSearch(segment a[],int n,point k)/*在有序的数组a[0]~a[n-1]中查找k元素*/
  75. {
  76. int low=,high=n-,mid;
  77. while(low<=high)
  78. {
  79. mid=low+((high-low)/);
  80. if(cross_product(vector_minus(a[mid].p1,k),vector_minus(a[mid].p2,k))<) high=mid-;/*线段在右边*/
  81. else low=mid+;
  82. }
  83. if(low>high) return high;
  84. }
  85. int main()
  86. {
  87. int n,m,i,a[N],b[N];
  88. double x1,x2,y1,y2;
  89. point p;
  90. segment s[N];
  91. while()
  92. {
  93. scanf("%d",&n);
  94. if(n==) break;
  95. scanf("%d%lf%lf%lf%lf",&m,&x1,&y1,&x2,&y2);
  96. s[].p1.x=x1;
  97. s[].p1.y=y1;
  98. s[].p2.x=x1;
  99. s[].p2.y=y2;
  100. for(i=;i<=n;i++)
  101. {
  102. scanf("%lf%lf",&s[i].p1.x,&s[i].p2.x);
  103. s[i].p1.y=y1;
  104. s[i].p2.y=y2;
  105. }
  106. s[i].p1.x=x2;
  107. s[i].p1.y=y1;
  108. s[i].p2.x=x2;
  109. s[i].p2.y=y2;
  110. Quick_sort(s,,n+);
  111. for(i=;i<N;i++) a[i]=;
  112. for(i=;i<m;i++)
  113. {
  114. scanf("%lf%lf",&p.x,&p.y);
  115. a[BinSearch(s,n+,p)]++;
  116. }
  117. for(i=;i<N;i++) b[i]=;
  118. for(i=;i<N;i++) b[a[i]]++;
  119. printf("Box\n");
  120. for(i=;i<N;i++) if(b[i]) printf("%d: %d\n",i,b[i]);
  121. }
  122. return ;
  123. }

PKU 2398

【解题报告】PKU 2318 TOYS AND PKU 2398 Toy Storage的更多相关文章

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

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

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

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

  3. poj 2398 Toy Storage(计算几何)

    题目传送门:poj 2398 Toy Storage 题目大意:一个长方形的箱子,里面有一些隔板,每一个隔板都可以纵切这个箱子.隔板将这个箱子分成了一些隔间.向其中扔一些玩具,每个玩具有一个坐标,求有 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 浅谈mysql中varchar(m)与char(n)的区别与联系

    mysql建表长度的限制 在mysql建表时,出现以下报错信息: 错误一:行大小过大,所使用的表这种类型的最大的行大小,不算BLOB类型,是65535.(这是我翻译的)    原因是MySQL在建表的 ...

  2. SQL注入攻击

    SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...

  3. ibatis2.3中#和$符号的区别(转)

    在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如: select * from ...

  4. Spring框架学习之第9节

    aop编程 aop(aspect oriented programming)面向切面(方面)编程,是所有对象或者是一类对象编程,核心是(在不增加代码的基础上,还增加新功能) 汇编(伪机器指令 mov ...

  5. JAVA编译异常处理:java.lang.OutOfMemoryError: PermGen space

    在Intellij开发工具中编译JAVA项目,出现以下错误: 六月 21, 2016 6:28:07 下午 org.apache.tomcat.util.modeler.BaseModelMBean ...

  6. iOS LLDB调试器和断点调试

    技巧一:运行时修改变量的值 你以前怎么验证是不是某个变量的值导致整段程序不能正常工作?修改代码中的变量的值,然后cmd+r重新启动app?现在你不需要这么做了,只需要设置一个断点,当程序在这进入调试模 ...

  7. ThreadLocal,ThreadLocalMap,Thread 的相互关系

    1.ThreadLocal. 真正关键的类是它的内部类ThreadLocalMap,ThreadLocal 基本上相当于一个代理,或者算是Facade模式的应用,还没想清楚这种设计的妙处.(经过分析, ...

  8. Linux内核通杀提权漏洞CVE-2016-5195 - 内核升级方法

    如题,对于脏牛(Dirty COW)漏洞的修复方式已经在上篇文章中有介绍过如何验证,这里对如何升级内核给出修复建议. (注意:为避免不必要的生产风险的发生,请审核自己的实际环境而决定采用什么方法进行升 ...

  9. struts2不兼容servlet、COS

    如果你在一个项目中使用了struts2,也就是说,你在web.xml中配置了如下代码: <filter> <filter-name>struts2</filter-nam ...

  10. 下拉刷新控件(1)PullToRefreshList示例

    有很多控件都可以下拉刷新如,ListView,ExpandableListView,GridView,ScrollView,ViewPager,WebView等, 其中最常见的是ListView.本文 ...