【BZOJ1845】[Cqoi2005] 三角形面积并

Description

给出n个三角形,求它们并的面积。

Input

第一行为n(N < = 100), 即三角形的个数 以下n行,每行6个整数x1, y1, x2, y2, x3, y3,代表三角形的顶点坐标。坐标均为不超过10 ^ 6的实数,输入数据保留1位小数

Output

输出并的面积u, 保留两位小数

Sample Input

2
0.0 0.0 2.0 0.0 1.0 1.0
1.0 0.0 3.0 0.0 2.0 1.0

Sample Output

1.75

题解:先求出所有直线交点的x坐标(注意eps!),然后从左到右扫描每个区域。发现每个区域都可以看成若干个梯形,所以只需要用一条直线去截这些梯形的中间,得到所有梯形的中位线长乘上高度即为答案。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7. const int maxn=110;
  8. const double eps=1e-10;
  9. double now,ans;
  10. int n,m,tot,sum;
  11. struct point
  12. {
  13. double x,y;
  14. point(){}
  15. point(double a,double b){x=a,y=b;}
  16. point operator + (point a) {return point(x+a.x,y+a.y);}
  17. point operator - (point a) {return point(x-a.x,y-a.y);}
  18. double operator * (point a) {return x*a.y-y*a.x;}
  19. point operator * (double a) {return point(x*a,y*a);}
  20. point operator / (double a) {return point(x/a,y/a);}
  21. };
  22. struct line
  23. {
  24. point x,v;
  25. line() {}
  26. line(point a,point b){x=a,v=b;}
  27. }s[310];
  28. struct trangle
  29. {
  30. point a,b,c;
  31. }t[110];
  32. struct node
  33. {
  34. double x;
  35. int v;
  36. }q[210];
  37. double p[100000];
  38. bool cmp(node a,node b)
  39. {
  40. return a.x<b.x;
  41. }
  42. point getpoint(line a,line b)
  43. {
  44. point u=a.x-b.x;
  45. double temp=(b.v*u)/(a.v*b.v);
  46. return a.x+a.v*temp;
  47. }
  48. void calc(line a,line b)
  49. {
  50. if(fabs(a.v*b.v)<eps) return ;
  51. point c=getpoint(a,b);
  52. p[++m]=c.x;
  53. }
  54. int main()
  55. {
  56. scanf("%d",&n);
  57. int i,j;
  58. for(i=1;i<=n;i++)
  59. {
  60. scanf("%lf%lf%lf%lf%lf%lf",&t[i].a.x,&t[i].a.y,&t[i].b.x,&t[i].b.y,&t[i].c.x,&t[i].c.y);
  61. if(t[i].a.x>t[i].b.x) swap(t[i].a,t[i].b);
  62. if(t[i].a.x>t[i].c.x) swap(t[i].a,t[i].c);
  63. if(t[i].b.x>t[i].c.x) swap(t[i].b,t[i].c);
  64. s[i]=line(t[i].a,t[i].b-t[i].a),s[i+n]=line(t[i].a,t[i].c-t[i].a),s[i+n+n]=line(t[i].b,t[i].c-t[i].b);
  65. }
  66. for(i=1;i<=3*n;i++) for(j=i+1;j<=3*n;j++) calc(s[i],s[j]);
  67. sort(p+1,p+m+1);
  68. for(i=1;i<m;i++)
  69. {
  70. if(p[i+1]-p[i]<eps) continue;
  71. now=(p[i]+p[i+1])/2;
  72. for(tot=0,j=1;j<=n;j++)
  73. {
  74. if(now>=t[j].a.x&&now<=t[j].b.x)
  75. {
  76. q[++tot].x=t[j].a.y+(t[j].b.y-t[j].a.y)/(t[j].b.x-t[j].a.x)*(now-t[j].a.x);
  77. q[++tot].x=t[j].a.y+(t[j].c.y-t[j].a.y)/(t[j].c.x-t[j].a.x)*(now-t[j].a.x);
  78. if(q[tot].x<q[tot-1].x) swap(q[tot],q[tot-1]);
  79. q[tot-1].v=1,q[tot].v=-1;
  80. }
  81. if(now>=t[j].b.x&&now<=t[j].c.x)
  82. {
  83. q[++tot].x=t[j].c.y+(t[j].b.y-t[j].c.y)/(t[j].c.x-t[j].b.x)*(t[j].c.x-now);
  84. q[++tot].x=t[j].c.y+(t[j].a.y-t[j].c.y)/(t[j].c.x-t[j].a.x)*(t[j].c.x-now);
  85. if(q[tot].x<q[tot-1].x) swap(q[tot],q[tot-1]);
  86. q[tot-1].v=1,q[tot].v=-1;
  87. }
  88. }
  89. sort(q+1,q+tot+1,cmp);
  90. for(sum=0,j=1;j<=tot;j++)
  91. {
  92. if(sum) ans+=(p[i+1]-p[i])*(q[j].x-q[j-1].x);
  93. sum+=q[j].v;
  94. }
  95. }
  96. printf("%.2lf",ans-eps);
  97. return 0;
  98. }

【BZOJ1845】[Cqoi2005] 三角形面积并 几何+扫描线的更多相关文章

  1. BZOJ 1845: [Cqoi2005] 三角形面积并 [计算几何 扫描线]

    1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1151  Solved: 313[Submit][Stat ...

  2. BZOJ1845 [Cqoi2005] 三角形面积并 扫描线 计算几何

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1845 题意概括 给出n个三角形,求其面积并. 题解 有一个很经典的扫描线题目:矩形面积并.那个比较 ...

  3. BZOJ1845 : [Cqoi2005] 三角形面积并

    求出所有交点后从左往右扫描线,用每段的中位线去截所有三角形,算出长度并后乘以该段长度即可,时间复杂度$O(n^3\log n)$. #include<cstdio> #include< ...

  4. bzoj 1845: [Cqoi2005] 三角形面积并 扫描线

    1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 848  Solved: 206[Submit][Statu ...

  5. CQOI2005 三角形面积并 和 POJ1177 Picture

    1845: [Cqoi2005] 三角形面积并 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 1664  Solved: 443[Submit][Stat ...

  6. [CQOI2005]三角形面积并

    [CQOI2005]三角形面积并 题目大意: 求\(n(n\le100)\)个三角形的面积并. 思路: 自适应辛普森法,玄学卡精度可过. 源代码: #include<cmath> #inc ...

  7. BZOJ 1845: [Cqoi2005] 三角形面积并 (辛普森积分)

    大力辛普森积分 精度什么的搞了我好久- 学到了Simpson的一个trick 深度开11,eps开1e-4.跑的比有些扫描线还快- CODE #include <bits/stdc++.h> ...

  8. [hdu4629 Burning]三角形面积并,扫描线

    题意:给n个三角形,分别求覆盖1次~n次的总面积 思路: 对每个y坐标作一条平行于x轴的直线,按直线从下往上处理,每两条直线之间为若干梯形(也可以是三角形)首尾相连的情况,从左扫到右时,用一个变量cn ...

  9. ytu 1058: 三角形面积(带参的宏 练习)

    1058: 三角形面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 190  Solved: 128[Submit][Status][Web Boar ...

随机推荐

  1. 2018.8.8 Noip2018模拟测试赛(二十一)

    日期: 八月七号  总分: 300分  难度: 提高 ~ 省选    得分: 112分(OvO) 题目目录: T1:幸福的道路 T2:Solitaire T3:Flags 赛后心得: 第一题裸树d啊! ...

  2. 【開發時,應注意事項】 vendor tools 無法 work 時,怎麼辦?

    遇到 vendor tools 無法 work 時, 最好的方法直接請 vendor 來, 為什麼呢? 因為 tool 可能 有版本的問題, 譬如: vendor tool A tool 在 buil ...

  3. Hystrix的介绍和简单使用

    这周在看项目的相关代码时,接触到了Hystrix,因此查询了相关资料学习了下. 一.什么是Hystrix Hystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微 ...

  4. GDKOI賽前總結

    @(賽前總結)[GDKOI2017] 提一些比賽時要注意的事項: 賽前先把讀入優化/輸出優化的模板調試好, 加入缺省源中. 注意不要出錯, 輸出為0或者負數的情況要特盤; 讀入輸出文件名不要搞錯; 由 ...

  5. MAC终端命令行整理

    参考:http://www.jianshu.com/p/3291de46f3ff 目录操作 命令名 说明 举例 cd 切换到指定目录 cd test ls 查看这个目录下的所有文件 ls /Users ...

  6. spring aop提供了两种实现方式jdk和cglib

    Spring AOP使用了两种代理机制:一种是基于JDK的动态代理:另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. Sprin ...

  7. Android--------------几个ADB经常使用命令

    1. 显示当前执行的所有模拟器:     adb devices 2. 安装应用程序:     adb install -r 123.apk 3. 获取模拟器中的文件:     adb pull &l ...

  8. Python学习笔记8:标准库之正則表達式

    Python拥有强大的标准库.从如今起,開始学习标准库中提供的一些经常使用功能. 首先看正則表達式(regular expression),它的主要功能是从字符串(string)中通过特定的模式(pa ...

  9. PS 基础知识 .atn文件如何使用

    ANT文件就是Frames.atn类动作文件 具体安装步骤如下 : (以CS4 为例) 启动Photoshop 点击"窗口" 选"动作" 在弹出的动作面板里,点 ...

  10. C 标准库 - <errno.h>

    C 标准库 - <errno.h> 简介 C 标准库的 errno.h 头文件定义了整数变量 errno,它是通过系统调用设置的,在错误事件中的某些库函数表明了什么发生了错误.该宏扩展为类 ...