旋转卡壳算法;

直接在这个上面粘的模板

主要用途:用于求凸包的直径、宽度,两个不相交凸包间的最大距离和最小距离···

这题就是求凸包的直径

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. #define eps 1e-9
  7. using namespace std;
  8. const double pi = acos(-);
  9.  
  10. int dcmp(double x)
  11. {
  12. return fabs(x) < eps ? : (x > ? : -);
  13. }
  14.  
  15. struct Point
  16. {
  17. double x;
  18. double y;
  19.  
  20. Point(double x = , double y = ):x(x), y(y) {}
  21.  
  22. bool operator < (const Point& e) const
  23. {
  24. return dcmp(x - e.x) < || (dcmp(x - e.x) == && dcmp(y - e.y) < );
  25. }
  26.  
  27. bool operator == (const Point& e) const
  28. {
  29. return dcmp(x - e.x) == && dcmp(y - e.y) == ;
  30. }
  31. };
  32.  
  33. typedef Point Vector;
  34.  
  35. Vector operator + (Point A, Point B)
  36. {
  37. return Vector(A.x + B.x, A.y + B.y);
  38. }
  39.  
  40. Vector operator - (Point A, Point B)
  41. {
  42. return Vector(A.x - B.x, A.y - B.y);
  43. }
  44.  
  45. Vector operator * (Point A, double p)
  46. {
  47. return Vector(A.x * p, A.y * p);
  48. }
  49.  
  50. Vector operator / (Point A, double p)
  51. {
  52. return Vector(A.x / p, A.y / p);
  53. }
  54. double dot(Point a,Point b)
  55. {
  56. return a.x*b.x+a.y*b.y;
  57. }
  58. double cross(Point a,Point b)
  59. {
  60. return a.x*b.y-a.y*b.x;
  61. }
  62. Point rotate(Point a,double ang)
  63. {
  64. return Point(a.x*cos(ang)-a.y*sin(ang),a.x*sin(ang)+a.y*cos(ang));
  65. }
  66. int convexhull(Point *p,int n,Point *ch)
  67. {
  68. sort(p,p+n);
  69. int m=;
  70. for(int i=; i<n; i++)
  71. {
  72. while(m>&&cross(ch[m-]-ch[m-],p[i]-ch[m-])<=)m--;
  73. ch[m++]=p[i];
  74. }
  75. int k=m;
  76. for(int i=n-; i>=; i--)
  77. {
  78. while(m>k&&cross(ch[m-]-ch[m-],p[i]-ch[m-])<=)m--;
  79. ch[m++]=p[i];
  80. }
  81. if(n>)m--;
  82. return m;
  83. }
  84. bool onsegment(Point p,Point a,Point b)
  85. {
  86. return dcmp(cross(a-p,b-p))==&&dcmp(dot(a-p,b-p))<;
  87. }
  88.  
  89. bool SegmentProperIntersection( Point a1, Point a2, Point b1, Point b2 ) //线段相交,交点不在端点
  90. {
  91. double c1 = cross( a2 - a1, b1 - a1 ), c2 = cross( a2 - a1, b2 - a1 ),
  92. c3 = cross( b2 - b1, a1 - b1 ), c4 = cross( b2 - b1, a2 - b1 );
  93. return dcmp(c1)*dcmp(c2) < && dcmp(c3) * dcmp(c4) < ;
  94. }
  95.  
  96. int ispointinpolygon(Point p,int n,Point *poly)
  97. {
  98. int wn=;
  99. for(int i=; i<n; i++)
  100. {
  101. if(onsegment(p,poly[i],poly[(i+)%n]))return -;
  102. int k=dcmp(cross(poly[(i+)%n]-poly[i],p-poly[i]));
  103. int d1=dcmp(poly[i].y-p.y);
  104. int d2=dcmp(poly[(i+)%n].y-p.y);
  105. if(k>&&d1<=&&d2>)wn++;
  106. if(k<&&d2<=&&d1>)wn--;
  107. }
  108. if(wn!=)return ;
  109. return ;
  110. }
  111.  
  112. bool Check(int n,Point *ch,int m,Point *th)
  113. {
  114. for(int i=; i<n; i++)
  115. {
  116. if(ispointinpolygon(ch[i],m,th)!=)return ;
  117. }
  118. for(int i=; i<m; i++)
  119. if(ispointinpolygon(th[i],n,ch)!=)return ;
  120. ch[n]=ch[];
  121. th[m]=th[];
  122. for(int i=; i<n; i++)
  123. for(int j=; j<m; j++)
  124. if(SegmentProperIntersection(ch[i],ch[i+],th[j],th[j+]))return ;
  125. return ;
  126. }
  127. double rotating_calipers(Point *ch,int n)
  128. {
  129. int q=;
  130. double ans=;
  131. ch[n]=ch[];
  132. for ( int i = ; i < n; ++i )
  133. {
  134. while ( cross( ch[i + ] - ch[i], ch[q + ] - ch[i] ) > cross( ch[i + ] - ch[i], ch[q] - ch[i] ) )
  135. q = ( q + ) % n;
  136. ans = max( ans, max( dot( ch[i]- ch[q],ch[i]-ch[q] ),dot( ch[i + ]-ch[q + ],ch[i + ]-ch[q + ] ) ));
  137. }
  138. return ans;
  139. }
  140. Point p[],ch[];
  141. int main()
  142. {
  143. int n,m;
  144. double x,y,w;
  145. int t;
  146. scanf("%d",&t);
  147. while(t--)
  148. {
  149. scanf("%d",&n);
  150. int cnt=;
  151. for(int i=; i<n; i++)
  152. {
  153. scanf("%lf%lf%lf",&x,&y,&w);
  154. p[cnt].x=x,p[cnt++].y=y;
  155. p[cnt].x=x+w,p[cnt++].y=y;
  156. p[cnt].x=x,p[cnt++].y=y+w;
  157. p[cnt].x=x+w,p[cnt++].y=y+w;
  158. }
  159. int n1=convexhull(p,cnt,ch);
  160. printf("%.0lf\n",rotating_calipers(ch,n1));
  161. }
  162. return ;
  163. }

uva 1453 - Squares的更多相关文章

  1. UVa 1453 - Squares 旋转卡壳求凸包直径

    旋转卡壳求凸包直径. 参考:http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html #include <cstdio> ...

  2. UVa 201 Squares

    题意: 给出这样一个图,求一共有多少个大小不同或位置不同的正方形. 分析: 这种题一看就有思路,最开始的想法就是枚举正方形的位置,需要二重循环,枚举边长一重循环,判断是否为正方形又需要一重循环,复杂度 ...

  3. UVA 4728 Squares(凸包+旋转卡壳)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...

  4. 【每日一题】Squares UVA - 201 暴力+输出坑 + 读文件模板

    题意 给你n*n的图,让你数正方形 题解:暴力for每个点,对于每个点从它出发顺时针走一个正方形.走完就ans[i]++; 坑:多输了一行******,然后在那里手摸样例,无限debug orz #d ...

  5. 【UVA】201 Squares(模拟)

    题目 题目     分析 记录一下再预处理一下.     代码 #include <bits/stdc++.h> int main() { int t=0,s,n; while(scanf ...

  6. Squares UVA - 201

    A children's board game consists of a square array of dots that contains lines connecting some of th ...

  7. UVa 1643 Angle and Squares

    题意: 如图,有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值. 分析: 直观上来看,当这n个正方形的对角线在一条直线上时,封闭区域的面积最大.( ...

  8. UVA 12113 Overlapping Squares

    题意: 总共有6个2*2的正方形,判断是否能够成所给的形状. 思路: 一个正方形总共有9种摆放方式,对于整个地图来说摆放方式总共有2的9次方种摆放方式.然后将地图用9*5的数组表示,正方形的位置用其8 ...

  9. UVa 1643 Angle and Squares (计算几何)

    题意:有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值. 析:很容易知道只有所有的正方形的对角形在一条直线时,是最大的,然后根据数学关系,就容易得 ...

随机推荐

  1. 导出EXCEL数据时防止数值变科学计数的办法

    网上有很多说法,最简单直接正确的做法是判断一下是否为数值以及长度,然后给单元格加上以下CSS即可: mso-generic-font-family:auto;   mso-font-charset:1 ...

  2. JsonUtil对象与json互转

    OrderDto orderDto = JsonUtil.json2Object(json,     new TypeRef<OrderDto>() {     }); package c ...

  3. [转]ORACLE 绑定变量用法总结

    转:http://blog.csdn.net/wanghai__/article/details/4778343 在oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析 ...

  4. Linux Bash终端快捷键小结

    Ctrl + A  定位至行首 Ctrl + E  定位至行尾 Ctrl + U  向前删除至行首 Ctrl + K  向后删除至行尾 Ctrl + L  清屏

  5. 使用ASP.NET实现Windows Service定时执行任务

    转载http://blog.csdn.net/yanghua_kobe/article/details/6937816 我们怎样才能在服务器上使用asp.net定时执行任务而不需要安装windows ...

  6. Extjs事件继承注意事项

    Extjs事件继承总结: 在基类中只需配置通用事件,无需配置通用界面,通用界面无效,通用事件一直有效 基表格控制器

  7. oracle 高版本导出低版本数据库并且导入到低版本数据的方法

    第一步:sqlplus system/egis@orcl as sysdba;  进入sqlplus (输入管理员用户名/密码@数据库密码) 第二步: create directory dumpdir ...

  8. jfinal不能正确加载html网页,总是报错的解决方法

    今天自学jfinal,遇到一个很奇怪的问题,render("/index.html");总是报错. 仔细看错误日志,才发现原来是因为html网页放到了WEB-INF文件夹下面了,所 ...

  9. Google Android SDK开发范例------------20141119

    一.Edit和Checkbox完成对登陆密码的查看:添加Edit的setOnCheckedChageListener和对CheckBox的状态通过isCHecked判断 大体代码如下 CheckBox ...

  10. Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)

    3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...