大致题意:

  给出n个圆和m个三角形,求最小的的,能将所有图形覆盖的图形的周长。

  正解为求所有三角形顶点与圆的切点以及圆和圆的切点构造凸包,再求路径。

  因为要求结果误差<=1e-3 所以 我们可以在每个圆上,将圆分为1000(或更多)等分,得到每个圆上有1000个点,把这些点和三角形的顶点构造凸包,为减小误差,圆上两点的距离依然为圆弧的长度。这样累加边即可得答案。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<set>
  7. #include<map>
  8. #include<stack>
  9. #include<time.h>
  10. #include<cstdlib>
  11. #include<cmath>
  12. #include<list>
  13. using namespace std;
  14. #define MAXN 100100
  15. #define eps 1e-9
  16. #define For(i,a,b) for(int i=a;i<=b;i++)
  17. #define Fore(i,a,b) for(int i=a;i>=b;i--)
  18. #define lson l,mid,rt<<1
  19. #define rson mid+1,r,rt<<1|1
  20. #define mkp make_pair
  21. #define pb push_back
  22. #define cr clear()
  23. #define sz size()
  24. #define met(a,b) memset(a,b,sizeof(a))
  25. #define iossy ios::sync_with_stdio(false)
  26. #define fre freopen
  27. #define pi acos(-1.0)
  28. #define inf 1e6+7
  29. #define Vector Point
  30. const int Mod=1e9+;
  31. typedef unsigned long long ull;
  32. typedef long long ll;
  33. int dcmp(double x){
  34. if(fabs(x)<=eps) return ;
  35. return x<?-:;
  36. }
  37. struct Point{
  38. double x,y;
  39. int id;
  40. Point(double x=,double y=,int id=-):x(x),y(y),id(id) {}
  41. bool operator < (const Point &a)const{
  42. if(x==a.x) return y<a.y;
  43. return x<a.x;
  44. }
  45. Point operator - (const Point &a)const{
  46. return Point(x-a.x,y-a.y);
  47. }
  48. Point operator + (const Point &a)const{
  49. return Point(x+a.x,y+a.y);
  50. }
  51. Point operator * (const double &a)const{
  52. return Point(x*a,y*a);
  53. }
  54. Point operator / (const double &a)const{
  55. return Point(x/a,y/a);
  56. }
  57. void read(){
  58. scanf("%lf%lf",&x,&y);
  59. }
  60. void out(){
  61. cout<<"debug: "<<x<<" "<<y<<endl;
  62. }
  63. bool operator == (const Point &a)const{
  64. return dcmp(x-a.x)== && dcmp(y-a.y)==;
  65. }
  66. };
  67. double Dot(Vector a,Vector b) {
  68. return a.x*b.x+a.y*b.y;
  69. }
  70. double dis(Vector a) {
  71. return sqrt(Dot(a,a));
  72. }
  73. double Cross(Point a,Point b){
  74. return a.x*b.y-a.y*b.x;
  75. }
  76. int ConvexHull(Point *p,int n,Point *ch){
  77. int m=;
  78. For(i,,n-) {
  79. while(m> && Cross(ch[m-]-ch[m-],p[i]-ch[m-])<=) m--;
  80. ch[m++]=p[i];
  81. }
  82. int k=m;
  83. Fore(i,n-,){
  84. while(m>k && Cross(ch[m-]-ch[m-],p[i]-ch[m-])<=) m--;
  85. ch[m++]=p[i];
  86. }
  87. if(n>) m--;
  88. return m;
  89. }
  90. void Swap(int &p1,int &p2){
  91. p1^=p2;
  92. p2^=p1;
  93. p1^=p2;
  94. }
  95. int n,m;
  96. Point p[];
  97. Point ch[];
  98. Point cp[];
  99. double r[];
  100. void solve(){
  101. int rt=;
  102. For(i,,n-) cp[i].read(),scanf("%lf",&r[i]);
  103. For(i,,m-) p[rt].id=n,p[rt++].read(),p[rt].id=n,p[rt++].read(),p[rt].id=n,p[rt++].read();
  104. For(i,,n-) {
  105. For(j,,){
  106. double ang=*j*pi*1.0/;
  107. p[rt++]=Point(cp[i].x+r[i]*cos(ang),cp[i].y+r[i]*sin(ang),i);
  108. }
  109. }
  110. sort(p,p+rt);
  111. m=ConvexHull(p,rt,ch);
  112. double ans=;
  113. For(i,,m-) {
  114. if(ch[i].id==ch[(i+)%m].id && ch[i].id!=n) {
  115. ans+=pi**r[ch[i].id]/;
  116. }
  117. else ans+=dis(ch[i]-ch[(i+)%m]);
  118. }
  119. printf("%.5lf\n",ans);
  120. }
  121. int main(){
  122. // fre("in.txt","r",stdin);
  123. int t=;
  124. while(~scanf("%d%d",&n,&m)) solve();
  125. return ;
  126. }

[hdu4667]Building Fence 计算几何 瞎瘠薄搞的更多相关文章

  1. HDU 4667 Building Fence 计算几何 凸包+圆

    1.三角形的所有端点 2.过所有三角形的端点对所有圆做切线,得到所有切点. 3.做任意两圆的外公切线,得到所有切点. 对上述所有点求凸包,标记每个点是三角形上的点还是某个圆上的点. 求完凸包后,因为所 ...

  2. hdu 4667 Building Fence < 计算几何模板>

    //大白p263 #include <cmath> #include <cstdio> #include <cstring> #include <string ...

  3. HDU 4667 Building Fence(2013多校7 1002题 计算几何,凸包,圆和三角形)

    Building Fence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)To ...

  4. 汕头市队赛 SRM14 T1 计算几何瞎暴力

    计算几何瞎暴力 (easy.pas/c/cpp) 128MB 1s 在平面上,给定起点和终点,有一面墙(看作线段)不能穿过,问从起点走到终点的最短路程. 输入格式 输入一行,包含8个用空格分隔的整数x ...

  5. HDU 4667 Building Fence(求凸包的周长)

    A - Building Fence Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u ...

  6. LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力

    二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...

  7. zoj 3820 Building Fire Stations(树上乱搞)

    做同步赛的时候想偏了,状态总是时好时坏.这状态去区域赛果断得GG了. 题目大意:给一棵树.让求出树上两个点,使得别的点到两个点较近的点的距离最大值最小. 赛后用O(n)的算法搞了搞,事实上这道题不算难 ...

  8. BZOJ1278: 向量vector(计算几何 随机化乱搞)

    题意 题目链接 Sol 讲一下我的乱搞做法.... 首先我们可以按极角排序.然后对\(y\)轴上方/下方的加起来分别求模长取个最大值.. 这样一次是\(O(n)\)的. 我们可以对所有向量每次随机化旋 ...

  9. C - Building Fence

    Long long ago, there is a famous farmer named John. He owns a big farm and many cows. There are two ...

随机推荐

  1. Java设计模式の迭代器模式

    迭代器模式定义 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 迭代器模式的角色构成 (1)迭代器角色(Iterator):定义遍历元素所需 ...

  2. ECNA-A- Abstract Art

    题目描述 Arty has been an abstract artist since childhood, and his works have taken on many forms. His l ...

  3. HDU 3926 并查集 图同构简单判断 STL

    给出两个图,问你是不是同构的... 直接通过并查集建图,暴力用SET判断下子节点个数就行了. /** @Date : 2017-09-22 16:13:42 * @FileName: HDU 3926 ...

  4. CF760 D Travel Card 简单DP

    link 题意:乘车,有3种票 1.20块坐1站 2.坐90分钟,50块 3.坐1440分钟,120块 现给出到达每个站的时间,问最优策略 思路: 简单DP,限定条件的3个转移方向,取最小的那个就行了 ...

  5. [php]手动搭建php开发环境(排错)

    前提:针对自己的系统下载相应的php.apache.mysql,安装完毕后按照以下去配置httpd.conf和php.ini 本人用的是php5.6.4和apache2.4.4 一.Apache : ...

  6. Vue的keep-alive

    Vue的keep-alive: 简答的做下理解 缓存!页面从某一个页面跳转到另一个页面的时候,需要进行一定的缓存,然后这个时候调用的钩子函数是actived,而在第一次加载的时候,created.ac ...

  7. 大聊Python----迭代器

    迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器和带yield的ge ...

  8. 2013-7-31hibernate二级缓存

    难得闲 Fckeditor Fckconfig.js大部分配置都在这里面, 增加字体:         程序代码: FCKConfig.FontNames = 'Arial;Comic Sans MS ...

  9. 给vim安装YouCompleteMe

    要安装YouCompleteMe ,vim须支持python.看是否支持,可以在vim中:version 查看, 如果python前有+号,就是支持,减号就是不支持. 如果不支持,需要以编译安装方式重 ...

  10. MAC泛洪攻击

    先来解释一下啥是泛洪攻击 交换机里有一张专门记录MAC地址的表,为了完成数据的快速转发,该表具有自动学习机制:泛洪攻击即是攻击者利用这种学习机制不断发送不同的MAC地址给交换机,充满整个MAC表,此时 ...