http://poj.org/problem?id=2826

题目大意:给两条线,让它接竖直下的雨,问其能装多少横截面积的雨。

————————————————————————————

水题,看题目即可知道。

但是细节是真的多……不过好在两次AC应该没算被坑的很惨(全程没查题解)。

推荐交之前看一下讨论版的数据,方便一次AC(我第一次就是作死直接交了结果我自己都想好的情况忘了写了……)

相信看到这篇题解的人都看过题了,那么先说细节:

1.C++提交(G++不知道为什么WA了……)

2.精度

3.特殊情况,看看下面哪种情况你没有考虑到(以下都是没法装水的情况):

还有一种能够接水的情况:

将上面考虑完了,应该就差不多了。

那么说一下正解:

1.ko掉所有平行情况。(图3)

2.ko掉所有不相交情况。(图6)

3.ko掉所有斜率为0的情况。(图5)

4.上述两种情况完成后,求交点。

5.发现图1和图7情况只存在于斜率同号的情况下,特判之。

6.图2和图4一并解决:从交点处画一条平行于x的线,如果在该线上方的点的个数不为2,则不能接水。

7.上述情况讨论完后一定能接水,从6中获得的两个点取y值最小的点画一条平行于x的线,则围成的面积即为所求

总结:

线关系和线交点的题,细节较多,代码实现较长较繁琐,不推荐读下面代码。

  1. #include<cstdio>
  2. #include<queue>
  3. #include<cctype>
  4. #include<cstring>
  5. #include<stack>
  6. #include<cmath>
  7. #include<algorithm>
  8. using namespace std;
  9. typedef double dl;
  10. const dl eps=1e-;
  11. const dl INF=;
  12. struct point{
  13. dl x;
  14. dl y;
  15. }p[];
  16. inline point getmag(point a,point b){
  17. point s;
  18. s.x=b.x-a.x;s.y=b.y-a.y;
  19. return s;
  20. }
  21. inline dl multiX(point a,point b){
  22. return a.x*b.y-b.x*a.y;
  23. }
  24. inline dl multiP(point a,point b){
  25. return a.x*b.x+b.y*a.y;
  26. }
  27. inline bool parallel_mag(point a,point b){
  28. if(fabs(a.x*b.y-a.y*b.x)<eps)return ;
  29. return ;
  30. }
  31. inline bool check(point a,point b,point c,point d){
  32. if(multiX(getmag(c,d),getmag(c,a))*multiX(getmag(c,d),getmag(c,b))>eps)return ;
  33. if(multiX(getmag(a,b),getmag(a,c))*multiX(getmag(a,b),getmag(a,d))>eps)return ;
  34. return ;
  35. }
  36. inline point intersection(point a,point b,point c,point d){
  37. point s;
  38. dl a1=a.y-b.y,b1=b.x-a.x,c1=a.x*b.y-b.x*a.y;
  39. dl a2=c.y-d.y,b2=d.x-c.x,c2=c.x*d.y-d.x*c.y;
  40. s.x=(c1*b2-c2*b1)/(a2*b1-a1*b2);
  41. s.y=(a2*c1-a1*c2)/(a1*b2-a2*b1);
  42. return s;
  43. }
  44. inline dl slope(point a,point b){
  45. if(fabs(a.x-b.x)<eps)return INF;
  46. return (a.y-b.y)/(a.x-b.x);
  47. }
  48. inline bool deng(point a,point b){
  49. if(fabs(a.x-b.x)<eps&&fabs(a.y-b.y)<eps)return ;
  50. return ;
  51. }
  52. inline bool pan(point s){
  53. dl k1=slope(p[],p[]);
  54. dl k2=slope(p[],p[]);
  55. if(fabs(k1)<eps||fabs(k2)<eps)return ;
  56. if(k1>eps&&k2>eps){
  57. if(k2-k1>eps){
  58. if(-eps<p[].x-p[].x)return ;
  59. }else{
  60. if(-eps<p[].x-p[].x)return ;
  61. }
  62. }
  63. if(k1<-eps&&k2<-eps){
  64. if(k1<k2){
  65. if(p[].x-p[].x>-eps)return ;
  66. }else{
  67. if(p[].x-p[].x>-eps)return ;
  68. }
  69. return ;
  70. }
  71. int ok=;
  72. for(int i=;i<=;i++){
  73. if(p[i].y-s.y>eps){
  74. ok++;
  75. }
  76. }
  77. if(ok!=)return ;
  78. return ;
  79. }
  80. dl area(){
  81. if(parallel_mag(getmag(p[],p[]),getmag(p[],p[])))return ;
  82. if(!check(p[],p[],p[],p[]))return ;
  83. point s=intersection(p[],p[],p[],p[]);
  84. if(!pan(s))return ;
  85. int s1=,s2=;
  86. for(int i=;i<=;i++){
  87. if(p[i].y-s.y>eps){
  88. if(!s1)s1=i;
  89. else s2=i;
  90. }
  91. }
  92. point ns,nss,n1,n2;
  93. if(eps<p[s2].y-p[s1].y){
  94. ns.x=p[s1].x;ns.y=p[s1].y;
  95. }else{
  96. ns.x=p[s2].x;ns.y=p[s2].y;
  97. }
  98. nss.x=INF;nss.y=ns.y;
  99. n1=intersection(p[],p[],ns,nss);
  100. n2=intersection(p[],p[],ns,nss);
  101. return fabs(multiX(getmag(s,n1),getmag(s,n2)))/;
  102. }
  103. int main(){
  104. int t;
  105. scanf("%d",&t);
  106. while(t--){
  107. for(int i=;i<=;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
  108. if(p[].x>p[].x)swap(p[],p[]);
  109. if(p[].x>p[].x)swap(p[],p[]);
  110. printf("%.2f\n",area());
  111. }
  112. return ;
  113. }

POJ2826:An Easy Problem?!——题解(配特殊情况图)的更多相关文章

  1. poj2826 An Easy Problem?!【计算几何】

    含[三点坐标计算面积].[判断两线段是否有交点].[求线段交点]模板   An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Tot ...

  2. Poj2826 An Easy Problem

    呵呵哒.WA了无数次,一开始想的办法最终发现都有缺陷.首先需要知道: 1)线段不相交,一定面积为0 2)有一条线段与X轴平行,面积一定为0 3)线段相交,但是能接水的三角形上面线段把下面的线段完全覆盖 ...

  3. poj2826 An Easy Problem?!(计算几何)

    传送门 •题意 两根木块组成一个槽,给定两个木块的两个端点 雨水竖直下落,问槽里能装多少雨水, •思路 找不能收集到雨水的情况 我们令线段较高的点为s点,较低的点为e点 ①两条木块没有交点 ②平行或重 ...

  4. LuoguP7852 「EZEC-9」Yet Another Easy Problem 题解

    Content 给定 \(n,m\),你需要输出一个长度为 \(n\) 的排列,满足该排列进行不超过 \(m\) 次交换操作可以得到的最小的字典序最大. 数据范围:\(T\) 组数据,\(1\leqs ...

  5. An Easy Problem?!(细节题,要把所有情况考虑到)

    http://poj.org/problem?id=2826 An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  6. POJ 2826 An Easy Problem?![线段]

    An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12970   Accepted: 199 ...

  7. POJ 2826 An Easy Problem?!

    An Easy Problem?! Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7837   Accepted: 1145 ...

  8. HDU 5475 An easy problem 线段树

    An easy problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  9. [POJ] 2453 An Easy Problem [位运算]

    An Easy Problem   Description As we known, data stored in the computers is in binary form. The probl ...

随机推荐

  1. DSP5509的中断学习-第4篇

    1. 编译工程的时候出现一个问题,如下 specifies large memory model, which is not compatible with small memory 2. 修改工程设 ...

  2. vs找不到lib以及编译的link过程中出现的问题

    1.#pragma comment 程序中已经通过该语句完成lib库的引入,如果再在input里面添加lib库就会报错: 2.要在general的“导入外部库”的设置选项的目录下面添加引用到的lib库 ...

  3. uvaoj 133 - The Dole Queue(逻辑,环形队列数数)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. Linux命令应用大词典-第12章 程序编译

    12.1 gcc:GNU项目的C和C++编译器 12.2 gdberver:为GNU调试的远程服务器 12.3 cmake:跨平台的Makefile生成工具 12.4 indent:更改通过插入或删除 ...

  5. TW实习日记:第23天

    主要的项目已经在修改一些细节以提高用户体验的阶段了,所以并不是太忙,主要就是对样式和一些细节修修改改.然后下午帮助同事的新项目做了一个功能点,主要就是调通接口就行,因为参数巨多,所以总要和网端那边的后 ...

  6. ORACLE高级部分内容

    1.pl/sql基本语句 DECLARE BEGIN END; / 循环语句 DECLARE I  NUMBER(2):=1; BEGIN WHILE I<100 LOOP I:=I+1; EN ...

  7. lintcode433 岛屿的个数

    岛屿的个数 给一个01矩阵,求不同的岛屿的个数. 0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右为相邻. 您在真实的面试中是否遇到过这个题? Yes 样例 在矩阵: ...

  8. 理解Python中的__builtin__和__builtins__

    以Python 2.7为例,__builtin__模块和__builtins__模块的作用在很多情况下是相同的. 但是,在Python 3+中,__builtin__模块被命名为builtins. 所 ...

  9. UVa 1225 - Digit Counting - ACM/ICPC Danang 2007 解题报告 - C语言

    1.题目大意 把前n$(n\le 10000)$个整数顺次写在一起:12345678910111213……计算0~9各出现了多少次. 2.思路 第一想法是打表,然而觉得稍微有点暴力.不过暂时没有想到更 ...

  10. Ext JS 6学习文档-第4章-数据包

    Ext JS 6学习文档-第4章-数据包 数据包 本章探索 Ext JS 中处理数据可用的工具以及服务器和客户端之间的通信.在本章结束时将写一个调用 RESTful 服务的例子.下面是本章的内容: 模 ...