1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. using namespace std;
  6. const int N=505;
  7. int d,b,n,m;
  8. struct dian
  9. {
  10. double x,y;
  11. dian(double X=0,double Y=0)
  12. {
  13. x=X,y=Y;
  14. }
  15. dian operator + (const dian &a) const
  16. {
  17. return dian(x+a.x,y+a.y);
  18. }
  19. dian operator - (const dian &a) const
  20. {
  21. return dian(x-a.x,y-a.y);
  22. }
  23. dian operator * (const double &a) const
  24. {
  25. return dian(x*a,y*a);
  26. }
  27. dian operator / (const double &a) const
  28. {
  29. return dian(x/a,y/a);
  30. }
  31. }a[N],p[N];
  32. struct bian
  33. {
  34. dian s,v;//s表示向量的起点,v表示向量的方向和长度(从(0,0)射出)
  35. bian(dian S=dian(),dian V=dian())
  36. {
  37. s=S,v=V;
  38. }
  39. }l[N],q[N];
  40. double cj(dian a,dian b)//叉积
  41. {
  42. return a.x*b.y-a.y*b.x;
  43. }
  44. double mj(dian a,dian b,dian c)//求有向面积
  45. {
  46. return cj(b-a,c-a)/2.0;
  47. }
  48. dian jd(bian x,bian y)//求交点
  49. {
  50. return x.s+x.v*(cj(x.s-y.s,y.v)/cj(y.v,x.v));
  51. }
  52. bool px(bian x,bian y)//判断平行
  53. {
  54. return cj(y.v,x.v)==0;
  55. }
  56. bool bn(bian x,bian y)//x在y的逆时针方向(平行先左后右
  57. {
  58. double ar=cj(x.v,y.v);
  59. return (ar>0)||((ar==0)&&cj(x.v,y.s-x.s)>0);
  60. }
  61. bool dn(dian x,bian y)//点在线的逆时针方向
  62. {
  63. return cj(y.v,x-y.s)<=0;
  64. }
  65. bool cmp(const bian &x,const bian &y)//极角排序
  66. {
  67. if(x.v.y==0&&y.v.y==0)//同与x轴平行
  68. return x.v.x<y.v.x;
  69. if((x.v.y<=0)==(y.v.y<=0))//同在x轴上或下(包括x轴)
  70. return bn(x,y);
  71. return x.v.y<y.v.y;//一上一下下在前
  72. }
  73. int main()
  74. {
  75. scanf("%d",&d);
  76. for(int i=1;i<=d;i++)
  77. {
  78. scanf("%d",&b);
  79. for(int j=1;j<=b;j++)
  80. {
  81. int x,y;
  82. scanf("%d%d",&x,&y);
  83. p[n+j].x=x,p[n+j].y=y;//cout<<p[n+j].x<<" "<<p[n+j].y<<endl;
  84. if(j!=1)
  85. l[++m]=bian(p[n+j-1],p[n+j]-p[n+j-1]);
  86. }
  87. n+=b;
  88. l[++m]=bian(p[n],p[n-b+1]-p[n]);
  89. }
  90. //半平面交
  91. sort(l+1,l+m+1,cmp);
  92. int top=0;
  93. for(int i=1;i<=m;i++)
  94. {
  95. if(i==1||!px(l[i],l[i-1]))//去掉平行边
  96. top++;
  97. l[top]=l[i];
  98. }
  99. m=top;
  100. int ll=1,rr=2;
  101. q[1]=l[1],q[2]=l[2];
  102. for(int i=3;i<=m;i++)//每次新加入向量,就会删掉在向量右边的交点(线上的也要删),维护的凸包首尾都是要删除的,最后还要模拟插入队头,把队尾中多余的半平面去掉
  103. {
  104. while(ll<rr&&dn(jd(q[rr],q[rr-1]),l[i]))
  105. rr--;
  106. while(ll<rr&&dn(jd(q[ll],q[ll+1]),l[i]))
  107. ll++;
  108. s[++rr]=l[i];
  109. }
  110. while(ll<rr&&dn(jd(q[rr],q[rr-1]),q[ll]))
  111. rr--;//cout<<rr<<endl;
  112. if(rr-ll<=1)
  113. {
  114. puts("0.000");
  115. return 0;
  116. }
  117. top=0;
  118. q[ll-1]=q[rr];
  119. for(int i=ll;i<=rr;i++)
  120. a[++top]=jd(q[i],q[i-1]);//求出相邻两边的交点,转化为凸包的记录方法
  121. double ans=0.0;
  122. for(int i=3;i<=top;i++)
  123. ans+=mj(a[1],a[i-1],a[i]);
  124. printf("%.3f\n",ans);
  125. return 0;
  126. }
  127. /*
  128. 2
  129. 6
  130. -2 0
  131. -1 -2
  132. 1 -2
  133. 2 0
  134. 1 2
  135. -1 2
  136. 4
  137. 0 -3
  138. 1 -1
  139. 2 2
  140. -1 0
  141. */

bzoj 2618【半平面交模板】的更多相关文章

  1. bzoj 2618 半平面交模板+学习笔记

    题目大意 给你n个凸多边形,求多边形的交的面积 分析 题意\(=\)给你一堆边,让你求半平面交的面积 做法 半平面交模板 1.定义半平面为向量的左侧 2.将所有向量的起点放到一个中心,以中心参照进行逆 ...

  2. POJ 3525 /// 半平面交 模板

    题目大意: 给定n,接下来n行逆时针给定小岛的n个顶点 输出岛内离海最远的点与海的距离 半平面交模板题 将整个小岛视为由许多半平面围成 那么以相同的比例缩小这些半平面 一直到缩小到一个点时 那个点就是 ...

  3. 半平面交模板(O(n*n)&& O(n*log(n))

    摘自http://blog.csdn.net/accry/article/details/6070621 首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分 ...

  4. POJ 半平面交 模板题 三枚

    给出三个半平面交的裸题. 不会的上百度上谷(gu)歌(gou)一下. 毕竟学长的语文是体育老师教的.(卡格玩笑,别当真.) 这种东西明白就好,代码可以当模板. //poj1474 Video Surv ...

  5. 再来一道测半平面交模板题 Poj1279 Art Gallery

    地址:http://poj.org/problem?id=1279 题目: Art Gallery Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  6. 半平面交模板(BZOJ1007)

    #include<cstdio> #include<algorithm> #define LDB long double using namespace std; ]; str ...

  7. 【BZOJ 2618】 2618: [Cqoi2006]凸多边形 (半平面交)

    2618: [Cqoi2006]凸多边形 Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input 第一 ...

  8. 2018.07.04 BZOJ 2618 Cqoi2006凸多边形(半平面交)

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec Memory Limit: 128 MB Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n ...

  9. BZOJ - 2618 凸多边形 (半平面交)

    题意:求n个凸多边形的交面积. 半平面交模板题. #include<bits/stdc++.h> using namespace std; typedef long long ll; ty ...

随机推荐

  1. HDU 5514 容斥原理

    Frogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  2. POJ 1470 Closest Common Ancestors【LCA Tarjan】

    题目链接: http://poj.org/problem?id=1470 题意: 给定若干有向边,构成有根数,给定若干查询,求每个查询的结点的LCA出现次数. 分析: 还是很裸的tarjan的LCA. ...

  3. 学习swift从青铜到王者之swift闭包06

    语法表达式 一般形式:{ (parameters) -> returnType in statements } 这里的参数(parameters),可以是in-out(输入输出参数),但不能设定 ...

  4. 基于unicorn-engine的虚拟机的实现(WxSpectre)

    反病毒虚拟机是一个很有优势的工具,可以说反病毒软件是否存在模拟器是衡量反病毒软件能力的一个指标.反病毒虚拟机不光是内嵌在反病毒软件内部,来动态执行样本.这种虚拟机一般也可以单独用来动态执行批量样本,检 ...

  5. 【c++】动态内存

    静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.它主要存放静态数据.全局数据和常量.注意:const常量在定义时必须初始化 栈区:在执行函数时,函数内局部变量的存储单 ...

  6. 全局最小割模版 n^3

    //点标从0-n-1, 開始时先init 复杂度n^3 //对于边(u,v,flow): //g[u][v]+=flow; //g[v][u]+=flow; typedef long long ll; ...

  7. Matplotlib绘图基础

    import matplotlib.pyplot as plt import numpy as np #绘图流程 x=np.linspace(-1,1,100) y=x**2 plt.plot(x,y ...

  8. Android:内存控制及OOM处理

      1. OOM(内存溢出)和Memory Leak(内存泄露)有什么关系? OOM可能是因为Memory Leak,也可能是你的应用本身就比较耗内存(比如图片浏览型的).所以,出现OOM不一定是Me ...

  9. CUDA编程(十)使用Kahan&#39;s Summation Formula提高精度

    CUDA编程(十) 使用Kahan's Summation Formula提高精度 上一次我们准备去并行一个矩阵乘法.然后我们在GPU上完毕了这个程序,当然是非常单纯的把任务分配给各个线程.也没有经过 ...

  10. [IT新应用]brave浏览器

    https://www.brave.com/about.html The web has become a different place. With the ad-tech ecosystem ou ...