传送门:An Easy Problem?!

题意:用两条线段接雨水,雨水是垂直落下的,问我们用给定的两条线段能接到多少水。

分析:看起来很简单,写起来略麻烦,先排除不能接到水的情况:

1. 两条线段不相交;

  2. 其中任意一条线段水平;

  3. 两条线段重合;

  4. 相交的情况下,最高的端点遮住了次高的端点

最后求线段交点确定三角形并用叉积求面积。

  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.  
  14. const double eps = 1e-;
  15. const double PI = acos(-1.0);
  16. const int N = ;
  17. int sgn(double x)
  18. {
  19. if(fabs(x) < eps)return ;
  20. if(x < )return -;
  21. else return ;
  22. }
  23. struct Point
  24. {
  25. double x,y;
  26. Point(){}
  27. Point(double _x,double _y)
  28. {
  29. x = _x;y = _y;
  30. }
  31. Point operator -(const Point &b)const
  32. {
  33. return Point(x - b.x,y - b.y);
  34. }
  35. //叉积
  36. double operator ^(const Point &b)const
  37. {
  38. return x*b.y - y*b.x;
  39. }
  40. };
  41. struct Line
  42. {
  43. Point s,e;
  44. Line(){}
  45. Line(Point _s,Point _e)
  46. {
  47. s = _s;e = _e;
  48. }
  49. //两直线相交求交点
  50. //第一个值为0表示直线重合,为1表示平行,为0表示相交,为2是相交
  51. //只有第一个值为2时,交点才有意义
  52. pair<int,Point> operator &(const Line &b)const
  53. {
  54. Point res=s;
  55. if(sgn((s-e)^(b.s-b.e))==)
  56. {
  57. if(sgn((s-b.e)^(b.s-b.e))==)
  58. return make_pair(,res);
  59. else return make_pair(,res);
  60. }
  61. double t=((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));
  62. res.x+=(e.x-s.x)*t;
  63. res.y+=(e.y-s.y)*t;
  64. return make_pair(,res);
  65. }
  66. };
  67. //判断线段相交
  68. bool inter(Line l1,Line l2)
  69. {
  70. return
  71. max(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) &&
  72. max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) &&
  73. max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) &&
  74. max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) &&
  75. sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e)) <= &&
  76. sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e)) <= ;
  77. }
  78. int main()
  79. {
  80. int T;
  81. Line l1,l2;
  82. scanf("%d",&T);
  83. while(T--)
  84. {
  85. double a,b,c,d;
  86. scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
  87. l1=Line(Point(a,b),Point(c,d));
  88. scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
  89. l2=Line(Point(a,b),Point(c,d));
  90. if(sgn(l1.s.y-l1.e.y)==||sgn(l2.s.y-l2.e.y)==||!inter(l1,l2))
  91. {
  92. puts("0.00");
  93. continue;
  94. }
  95. if(sgn(l1.s.y-l1.e.y)<)swap(l1.s,l1.e);
  96. if(sgn(l2.s.y-l2.e.y)<)swap(l2.s,l2.e);
  97. if(inter(Line(l1.s,Point(l1.s.x,)),l2)||inter(Line(l2.s,Point(l2.s.x,)),l1))
  98. {
  99. puts("0.00");
  100. continue;
  101. }
  102. if(sgn(l1.s.y-l2.s.y)<)
  103. {
  104. Point p=(l1&l2).second;
  105. Point p1=(Line(l1.s,Point(,l1.s.y))&l2).second;
  106. double ans=fabs((l1.s-p)^(p1-p))/;
  107. printf("%.2lf\n",ans);
  108. }
  109. else
  110. {
  111. Point p=(l1&l2).second;
  112. Point p1=(Line(l2.s,Point(,l2.s.y))&l1).second;
  113. double ans=fabs((l2.s-p)^(p1-p))/;
  114. printf("%.2lf\n",ans);
  115. }
  116. }
  117. }

poj2826(线段相交)的更多相关文章

  1. POJ 1066 Treasure Hunt (线段相交)

    题意:给你一个100*100的正方形,再给你n条线(墙),保证线段一定在正方形内且端点在正方形边界(外墙),最后给你一个正方形内的点(保证不再墙上) 告诉你墙之间(包括外墙)围成了一些小房间,在小房间 ...

  2. POJ 2653 Pick-up sticks (线段相交)

    题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...

  3. HDU1086You can Solve a Geometry Problem too(判断线段相交)

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  4. POJ 2653 Pick-up sticks【线段相交】

    题意:n根木棍随意摆放在一个平面上,问放在最上面的木棍是哪些. 思路:线段相交,因为题目说最多有1000根在最上面.所以从后往前处理,直到木棍没了或者最上面的木棍的总数大于1000. #include ...

  5. POJ 1556 The Doors【最短路+线段相交】

    思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...

  6. 还记得高中的向量吗?leetcode 335. Self Crossing(判断线段相交)

    传统解法 题目来自 leetcode 335. Self Crossing. 题意非常简单,有一个点,一开始位于 (0, 0) 位置,然后有规律地往上,左,下,右方向移动一定的距离,判断是否会相交(s ...

  7. 【POJ 2653】Pick-up sticks 判断线段相交

    一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...

  8. hdu 1558 线段相交+并查集

    题意:要求相交的线段都要塞进同一个集合里 sol:并查集+判断线段相交即可.n很小所以n^2就可以水过 #include <iostream> #include <cmath> ...

  9. poj 1269 线段相交/平行

    模板题 注意原题中说的线段其实要当成没有端点的直线.被坑了= = #include <cmath> #include <cstdio> #include <iostrea ...

随机推荐

  1. 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10

    关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ...

  2. 基于visual Studio2013解决面试题之1001去除数字

     题目

  3. hdu1200(来来回回串起来)

    Problem Description Mo and Larry have devised a way of encrypting messages. They first decide secret ...

  4. Eclipse用法和技巧十六:自动添加未实现方法2

    前面一篇文章里面介绍了一种常见的自动添加未实现函数的方法.这里在顺便补充几个方法.第一个方法,看上去有点怪怪的:        步骤一:Source > Clean Up: 步骤二:选择cust ...

  5. 类似QtiPlot的veusz,sigmaplot,pymol

    qtiplot在win下没那么好编译 依赖很多外部包的 scidavis 和 labplot是从他fork出来的 比较接近Origin 可以用这两个 FreeBSD 的 ports 里有直接 cd / ...

  6. Delphi - SEH研究

    技术交流,DH讲解. 前几天一个朋友在弄游戏外挂想带NP调试,就像自己来捕获游戏的异常.好像就要用到SEH这方面的知识.一起研究了一下,这里看下研究 和 在网上找的资料吧.SEH就是Structure ...

  7. 减少HTTP请求之合并图片详解(大型网站优化技术)

    原文:减少HTTP请求之合并图片详解(大型网站优化技术) 一.相关知识讲解 看过雅虎的前端优化35条建议,都知道优化前端是有多么重要.页面的加载速度直接影响到用户的体验.80%的终端用户响应时间都花在 ...

  8. 《Head First 设计模式》学习笔记——状态模式

    在软件开发过程中.应用程序可能会依据不同的情况作出不同的处理. 最直接的解决方式是将这些全部可能发生的情况全都考虑到.然后使用if... ellse语句来做状态推断来进行不同情况的处理. 可是对复杂状 ...

  9. 使用高德地图API

    http://lbs.amap.com/smart/map/developer/mode/ 简单的附上一张图,其实能做得比这个更强大.

  10. HTTP数据包头解析(简单清楚)

    [转]HTTP请求模型和头信息参考 参考: http://blog.csdn.net/baggio785/archive/2006/04/13/661410.aspx模型: http://blog.c ...