uva 1453 - Squares
旋转卡壳算法;
直接在这个上面粘的模板
主要用途:用于求凸包的直径、宽度,两个不相交凸包间的最大距离和最小距离···
这题就是求凸包的直径
- #include <cstdio>
- #include <cmath>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- #define eps 1e-9
- using namespace std;
- const double pi = acos(-);
- int dcmp(double x)
- {
- return fabs(x) < eps ? : (x > ? : -);
- }
- struct Point
- {
- double x;
- double y;
- Point(double x = , double y = ):x(x), y(y) {}
- bool operator < (const Point& e) const
- {
- return dcmp(x - e.x) < || (dcmp(x - e.x) == && dcmp(y - e.y) < );
- }
- bool operator == (const Point& e) const
- {
- return dcmp(x - e.x) == && dcmp(y - e.y) == ;
- }
- };
- typedef Point Vector;
- Vector operator + (Point A, Point B)
- {
- return Vector(A.x + B.x, A.y + B.y);
- }
- Vector operator - (Point A, Point B)
- {
- return Vector(A.x - B.x, A.y - B.y);
- }
- Vector operator * (Point A, double p)
- {
- return Vector(A.x * p, A.y * p);
- }
- Vector operator / (Point A, double p)
- {
- return Vector(A.x / p, A.y / p);
- }
- double dot(Point a,Point b)
- {
- return a.x*b.x+a.y*b.y;
- }
- double cross(Point a,Point b)
- {
- return a.x*b.y-a.y*b.x;
- }
- Point rotate(Point a,double ang)
- {
- return Point(a.x*cos(ang)-a.y*sin(ang),a.x*sin(ang)+a.y*cos(ang));
- }
- int convexhull(Point *p,int n,Point *ch)
- {
- sort(p,p+n);
- int m=;
- for(int i=; i<n; i++)
- {
- while(m>&&cross(ch[m-]-ch[m-],p[i]-ch[m-])<=)m--;
- ch[m++]=p[i];
- }
- int k=m;
- for(int i=n-; i>=; i--)
- {
- while(m>k&&cross(ch[m-]-ch[m-],p[i]-ch[m-])<=)m--;
- ch[m++]=p[i];
- }
- if(n>)m--;
- return m;
- }
- bool onsegment(Point p,Point a,Point b)
- {
- return dcmp(cross(a-p,b-p))==&&dcmp(dot(a-p,b-p))<;
- }
- bool SegmentProperIntersection( Point a1, Point a2, Point b1, Point b2 ) //线段相交,交点不在端点
- {
- double c1 = cross( a2 - a1, b1 - a1 ), c2 = cross( a2 - a1, b2 - a1 ),
- c3 = cross( b2 - b1, a1 - b1 ), c4 = cross( b2 - b1, a2 - b1 );
- return dcmp(c1)*dcmp(c2) < && dcmp(c3) * dcmp(c4) < ;
- }
- int ispointinpolygon(Point p,int n,Point *poly)
- {
- int wn=;
- for(int i=; i<n; i++)
- {
- if(onsegment(p,poly[i],poly[(i+)%n]))return -;
- int k=dcmp(cross(poly[(i+)%n]-poly[i],p-poly[i]));
- int d1=dcmp(poly[i].y-p.y);
- int d2=dcmp(poly[(i+)%n].y-p.y);
- if(k>&&d1<=&&d2>)wn++;
- if(k<&&d2<=&&d1>)wn--;
- }
- if(wn!=)return ;
- return ;
- }
- bool Check(int n,Point *ch,int m,Point *th)
- {
- for(int i=; i<n; i++)
- {
- if(ispointinpolygon(ch[i],m,th)!=)return ;
- }
- for(int i=; i<m; i++)
- if(ispointinpolygon(th[i],n,ch)!=)return ;
- ch[n]=ch[];
- th[m]=th[];
- for(int i=; i<n; i++)
- for(int j=; j<m; j++)
- if(SegmentProperIntersection(ch[i],ch[i+],th[j],th[j+]))return ;
- return ;
- }
- double rotating_calipers(Point *ch,int n)
- {
- int q=;
- double ans=;
- ch[n]=ch[];
- for ( int i = ; i < n; ++i )
- {
- while ( cross( ch[i + ] - ch[i], ch[q + ] - ch[i] ) > cross( ch[i + ] - ch[i], ch[q] - ch[i] ) )
- q = ( q + ) % n;
- ans = max( ans, max( dot( ch[i]- ch[q],ch[i]-ch[q] ),dot( ch[i + ]-ch[q + ],ch[i + ]-ch[q + ] ) ));
- }
- return ans;
- }
- Point p[],ch[];
- int main()
- {
- int n,m;
- double x,y,w;
- int t;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d",&n);
- int cnt=;
- for(int i=; i<n; i++)
- {
- scanf("%lf%lf%lf",&x,&y,&w);
- p[cnt].x=x,p[cnt++].y=y;
- p[cnt].x=x+w,p[cnt++].y=y;
- p[cnt].x=x,p[cnt++].y=y+w;
- p[cnt].x=x+w,p[cnt++].y=y+w;
- }
- int n1=convexhull(p,cnt,ch);
- printf("%.0lf\n",rotating_calipers(ch,n1));
- }
- return ;
- }
uva 1453 - Squares的更多相关文章
- UVa 1453 - Squares 旋转卡壳求凸包直径
旋转卡壳求凸包直径. 参考:http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html #include <cstdio> ...
- UVa 201 Squares
题意: 给出这样一个图,求一共有多少个大小不同或位置不同的正方形. 分析: 这种题一看就有思路,最开始的想法就是枚举正方形的位置,需要二重循环,枚举边长一重循环,判断是否为正方形又需要一重循环,复杂度 ...
- UVA 4728 Squares(凸包+旋转卡壳)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...
- 【每日一题】Squares UVA - 201 暴力+输出坑 + 读文件模板
题意 给你n*n的图,让你数正方形 题解:暴力for每个点,对于每个点从它出发顺时针走一个正方形.走完就ans[i]++; 坑:多输了一行******,然后在那里手摸样例,无限debug orz #d ...
- 【UVA】201 Squares(模拟)
题目 题目 分析 记录一下再预处理一下. 代码 #include <bits/stdc++.h> int main() { int t=0,s,n; while(scanf ...
- Squares UVA - 201
A children's board game consists of a square array of dots that contains lines connecting some of th ...
- UVa 1643 Angle and Squares
题意: 如图,有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值. 分析: 直观上来看,当这n个正方形的对角线在一条直线上时,封闭区域的面积最大.( ...
- UVA 12113 Overlapping Squares
题意: 总共有6个2*2的正方形,判断是否能够成所给的形状. 思路: 一个正方形总共有9种摆放方式,对于整个地图来说摆放方式总共有2的9次方种摆放方式.然后将地图用9*5的数组表示,正方形的位置用其8 ...
- UVa 1643 Angle and Squares (计算几何)
题意:有n个正方形和一个角(均在第一象限中),使这些正方形与这个角构成封闭的阴影区域,求阴影区域面积的最大值. 析:很容易知道只有所有的正方形的对角形在一条直线时,是最大的,然后根据数学关系,就容易得 ...
随机推荐
- 导出EXCEL数据时防止数值变科学计数的办法
网上有很多说法,最简单直接正确的做法是判断一下是否为数值以及长度,然后给单元格加上以下CSS即可: mso-generic-font-family:auto; mso-font-charset:1 ...
- JsonUtil对象与json互转
OrderDto orderDto = JsonUtil.json2Object(json, new TypeRef<OrderDto>() { }); package c ...
- [转]ORACLE 绑定变量用法总结
转:http://blog.csdn.net/wanghai__/article/details/4778343 在oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析 ...
- Linux Bash终端快捷键小结
Ctrl + A 定位至行首 Ctrl + E 定位至行尾 Ctrl + U 向前删除至行首 Ctrl + K 向后删除至行尾 Ctrl + L 清屏
- 使用ASP.NET实现Windows Service定时执行任务
转载http://blog.csdn.net/yanghua_kobe/article/details/6937816 我们怎样才能在服务器上使用asp.net定时执行任务而不需要安装windows ...
- Extjs事件继承注意事项
Extjs事件继承总结: 在基类中只需配置通用事件,无需配置通用界面,通用界面无效,通用事件一直有效 基表格控制器
- oracle 高版本导出低版本数据库并且导入到低版本数据的方法
第一步:sqlplus system/egis@orcl as sysdba; 进入sqlplus (输入管理员用户名/密码@数据库密码) 第二步: create directory dumpdir ...
- jfinal不能正确加载html网页,总是报错的解决方法
今天自学jfinal,遇到一个很奇怪的问题,render("/index.html");总是报错. 仔细看错误日志,才发现原来是因为html网页放到了WEB-INF文件夹下面了,所 ...
- Google Android SDK开发范例------------20141119
一.Edit和Checkbox完成对登陆密码的查看:添加Edit的setOnCheckedChageListener和对CheckBox的状态通过isCHecked判断 大体代码如下 CheckBox ...
- Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description A 国有 n 座 ...