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

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=310;
  6. const double eps=1e-9,inf=2000000;
  7. struct P{
  8. double x,y;
  9. P(){x=y=0;}
  10. P(double _x,double _y){x=_x,y=_y;}
  11. P operator+(P v){return P(x+v.x,y+v.y);}
  12. P operator-(P v){return P(x-v.x,y-v.y);}
  13. P operator*(double v){return P(x*v,y*v);}
  14. P operator/(double v){return P(x/v,y/v);}
  15. double operator*(P v){return x*v.x+y*v.y;}
  16. }tri[N][4],seg[N];
  17. inline bool cmp(P a,P b){return a.x<b.x;}
  18. double px[N*N],ans;
  19. int n,i,j,k,l,m;
  20. inline int sig(double x){
  21. if(fabs(x)<eps)return 0;
  22. return x>0?1:-1;
  23. }
  24. inline double cross(P a,P b){return a.x*b.y-a.y*b.x;}
  25. inline bool has_intersection(P a,P b,P p,P q){
  26. int d1=sig(cross(b-a,p-a)),d2=sig(cross(b-a,q-a)),
  27. d3=sig(cross(q-p,a-p)),d4=sig(cross(q-p,b-p));
  28. return d1*d2<0&&d3*d4<0;
  29. }
  30. inline P line_intersection(P a,P b,P p,P q){
  31. double U=cross(p-a,q-p),D=cross(b-a,q-p);
  32. return a+(b-a)*(U/D);
  33. }
  34. inline double cal(double x){
  35. P D(x,-inf),U(x,inf);
  36. int i,m=0;
  37. for(i=0;i<n;i++){
  38. int j=0,k=0;double y[2];
  39. for(j=0;j<3;j++)if(has_intersection(tri[i][j],tri[i][j+1],D,U))
  40. y[k++]=line_intersection(tri[i][j],tri[i][j+1],D,U).y;
  41. if(k)seg[m++]=P(min(y[0],y[1]),max(y[0],y[1]));
  42. }
  43. if(m>1)sort(seg,seg+m,cmp);
  44. double l=-inf,r=-inf,t=0;
  45. for(i=0;i<m;i++){
  46. if(sig(seg[i].x-r)>0)t+=r-l,l=seg[i].x;
  47. r=max(r,seg[i].y);
  48. }
  49. return t+r-l;
  50. }
  51. int main(){
  52. scanf("%d",&n);
  53. for(i=0;i<n;i++){
  54. for(j=0;j<3;j++)scanf("%lf%lf",&tri[i][j].x,&tri[i][j].y);
  55. tri[i][3]=tri[i][0];
  56. }
  57. for(i=0;i<n;i++)for(j=0;j<3;j++)px[m++]=tri[i][j].x;
  58. for(i=0;i<n;i++)for(j=0;j<i;j++)for(k=0;k<3;k++)for(l=0;l<3;l++)
  59. if(has_intersection(tri[i][k],tri[i][k+1],tri[j][l],tri[j][l+1]))
  60. px[m++]=line_intersection(tri[i][k],tri[i][k+1],tri[j][l],tri[j][l+1]).x;
  61. sort(px,px+m);
  62. for(i=1;i<m;i++)if(sig(px[i]-px[i-1]))ans+=(px[i]-px[i-1])*cal((px[i]+px[i-1])/2);
  63. return printf("%.2f",ans-eps),0;
  64. }

  

BZOJ1845 : [Cqoi2005] 三角形面积并的更多相关文章

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

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

  2. 【BZOJ1845】[Cqoi2005] 三角形面积并 几何+扫描线

    [BZOJ1845][Cqoi2005] 三角形面积并 Description 给出n个三角形,求它们并的面积. Input 第一行为n(N < = 100), 即三角形的个数 以下n行,每行6 ...

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

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

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

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

  5. [CQOI2005]三角形面积并

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

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

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

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

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

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

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

  9. UVa 11437:Triangle Fun(计算几何综合应用,求直线交点,向量运算,求三角形面积)

    Problem ATriangle Fun Input: Standard Input Output: Standard Output In the picture below you can see ...

随机推荐

  1. 第11章 使用Vsftpd服务传输文件

    章节简述: 本章节先通过介绍文件传输协议来帮助读者理解FTP协议的用处,安装vsftpd服务程序并逐条分析服务文件的配置参数. 完整演示vsftpd服务匿名访问模式.本地用户模式及虚拟用户模式的配置方 ...

  2. 十条nmap常用的扫描命令

    NMap也就是Network Mapper,nmap是在网络安全渗透测试中经常会用到的强大的扫描器,功能之强大,不言而喻.下面介绍一下它的几种扫描命令.具体的还是得靠大家自己学习,因为实在太强大了. ...

  3. 总结使用Unity 3D优化游戏运行性能的经验

    原地址:http://www.gameres.com/msg_221889.html 作者:Amir Fasshihi 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow ...

  4. django-cms 代码研究(一)djangocms是什么

    首先用djangocms生成了一个站点(具体参考这里:http://www.cnblogs.com/Tommy-Yu/p/3878488.html),其文件结构如下: 本来以为会很有逼格,结果一看傻眼 ...

  5. Django之表单字段的选填与后台界面的管理

    参考: http://www.crazyant.net/1005.html http://gmingzhe.blog.51cto.com/810664/163051 所有的字段,默认blank=Fal ...

  6. Mysql数据库中设置root密码的命令及方法

    我们都知道通常PHP连接 Mysql都是通过root用户名和密码连接,默认情况下在Mysql安装时root初始密码为空,在安装使用PHP开源系统时,都需要填写连接Mysql数据库的用户名和密码,此时当 ...

  7. ToDo系列

    leetcode http://www.cnblogs.com/TenosDoIt/tag/leetcode/ http://tech-wonderland.net/category/algorith ...

  8. Stanford大学机器学习公开课(六):朴素贝叶斯多项式模型、神经网络、SVM初步

    (一)朴素贝叶斯多项式事件模型 在上篇笔记中,那个最基本的NB模型被称为多元伯努利事件模型(Multivariate Bernoulli Event Model,以下简称 NB-MBEM).该模型有多 ...

  9. linux编译中的常见问题

    转linux编译中的常见问题 错误提示:Makefile:2: *** 遗漏分隔符 . 停止. 原因makefile中 gcc语句前 缺少一个 tab分割符 错误提示: bash: ./makefil ...

  10. Android UI组件

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...