【BZOJ 1185】 凸包+旋转卡壳
Description
【分析】
打计算几何真的可以哭出来。。。
跟那个求线段最远点差不多,这题弄三个东西转一转,一个表示左端最远点,一个表示右端最远点,一个表示上面最远点。
左右两边的最远点用点积判断,上方最远点用差积判断。
【向量是最好的解决平面几何问题的,不要画图!!!哭!!!
输出那里,用的是向量加减法,乘一个比例系数,然后还用到了垂直单位向量。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 50010 const double eps=0.0000001;
const double INF=; struct P
{
double x,y;
}a[Maxn],t[Maxn];
int len,n; P operator - (P x,P y)
{
P tt;
tt.x=x.x-y.x;
tt.y=x.y-y.y;
return tt;
} P operator * (P x,double y)
{
P tt;
tt.x=x.x*y;
tt.y=x.y*y;
return tt;
} P operator + (P x,P y)
{
P tt;
tt.x=x.x+y.x;
tt.y=x.y+y.y;
return tt;
} double myabs(double x) {return x>?x:-x;} int fbs(double x)
{
if(myabs(x)<=eps) return ;
return x<?-:;
} double Dot(P x,P y) {return x.x*y.x+x.y*y.y;}
double Cross(P x,P y) {return x.x*y.y-x.y*y.x;}
bool cmp(P x,P y) {return fbs(x.x-y.x)==?(x.y<y.y):(x.x<y.x);} void chull()
{
sort(a+,a++n,cmp);
len=;
for(int i=;i<=n;i++)
{
while(len>&&Cross(t[len]-t[len-],a[i]-t[len])<=) len--;
t[++len]=a[i];
}
int k=len;
for(int i=n-;i>=;i--)
{
while(len>k&&Cross(t[len]-t[len-],a[i]-t[len])<=) len--;
t[++len]=a[i];
}len--;
t[]=t[len];
} void output()
{
for(int i=;i<len;i++)
{
printf("%lf %lf\n",t[i].x,t[i].y);
}printf("\n");
} double ans;
P op[]; void RC()
{
double L,R,H,D;
ans=INF;
int l=,r=,h=;
for(int i=;i<len;i++)
{
int j=(i+)%len;
// l=i;r=j;h=j;
// printf("%lf %lf\n",(t[h+1]-t[i]).x,(t[h+1]-t[i]).y);
// printf("%lf %lf\n",(t[h+1]-t[j]).x,(t[h+1]-t[j]).y);
while(Cross(t[h]-t[i],t[h]-t[j])<=Cross(t[h+]-t[i],t[h+]-t[j])) h=(h+)%len;
while(Dot(t[i]-t[j],t[r]-t[j])>=Dot(t[i]-t[j],t[r+]-t[j])) r=(r+)%len;
if(i==) l=r; // printf("%lf %lf\n",Dot(t[j]-t[i],t[l]-t[i]),Dot(t[j]-t[i],t[l+1]-t[i]));
while(Dot(t[j]-t[i],t[l]-t[i])>=Dot(t[j]-t[i],t[l+]-t[i])) l=(l+)%len; D=sqrt(Dot(t[i]-t[j],t[i]-t[j]));
H=Cross(t[h]-t[i],t[h]-t[j])/D;
L=-Dot(t[j]-t[i],t[l]-t[i])/D;
R=-Dot(t[i]-t[j],t[r]-t[j])/D; // printf("**%lf %lf %lf %lf\n",D,H,L,R); double now=(R+L+D)*H;
// printf("%lf %lf %d %d %d %lf\n",t[i].x,t[i].y,l,r,h,now);
if(now<ans)
{
ans=now;
op[]=t[i]-(t[j]-t[i])*(L/D);
op[]=t[j]-(t[i]-t[j])*(R/D);
P tt;
tt.x=(t[i]-t[j]).y;tt.y=-(t[i]-t[j]).x;
op[]=op[]+tt*(H/D);
op[]=op[]+tt*(H/D);
// op[0]=t[i];op[1]=t[j];op[2]=t[r];op[3]=t[l];
}
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
}
chull();
// output();
RC();
int fr=;
for(int i=;i<;i++) if(op[i].y<op[fr].y||fbs(op[fr].y-op[i].y)==&&op[i].x<op[i].x) fr=i;
printf("%.5lf\n",ans);
for(int i=;i<;i++)
{
if(fbs(op[i].x)==) op[i].x=;
if(fbs(op[i].y)==) op[i].y=;
}
// for(int i=0;i<4;i++) op[i].x=myabs(op[i].x),op[i].y=myabs(op[i].y);
for(int i=;i<;i++)
{
printf("%.5lf %.5lf\n",op[(fr+i)%].x,op[(fr+i)%].y);
}
return ;
}
调试过程不删了,心酸。。
2016-12-15 16:55:18
【BZOJ 1185】 凸包+旋转卡壳的更多相关文章
- bzoj 1069 凸包+旋转卡壳
题目大意 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成 的多边形面积最大. 分析 枚举对角线的一个端点 另一个端点开始转 转的时候求出对角线左边面积 ...
- [USACO2003][poj2187]Beauty Contest(凸包+旋转卡壳)
http://poj.org/problem?id=2187 题意:老题了,求平面内最远点对(让本渣默默想到了悲剧的AHOI2012……) 分析: nlogn的凸包+旋转卡壳 附:http://www ...
- UVA 4728 Squares(凸包+旋转卡壳)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...
- Code Chef GEOCHEAT(凸包+旋转卡壳+随机化)
题面 传送门 题解 以下记\(S_i=\{1,2,3,...,i\}\) 我们先用凸包+旋转卡壳求出直径的长度,并记直径的两个端点为\(i,j\)(如果有多条直径随机取两个端点) 因为这个序列被\(r ...
- poj 2079 Triangle (二维凸包旋转卡壳)
Triangle Time Limit: 3000MS Memory Limit: 30000KB 64bit IO Format: %I64d & %I64u Submit Stat ...
- poj 2187 Beauty Contest(二维凸包旋转卡壳)
D - Beauty Contest Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u ...
- POJ 2187 凸包+旋转卡壳
思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说 凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...
- BZOJ 1185 [HNOI2007]最小矩形覆盖:凸包 + 旋转卡壳
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 题意: 给出二维平面上的n个点,问你将所有点覆盖的最小矩形面积. 题解: 先找出凸 ...
- bzoj 1185 [HNOI2007]最小矩形覆盖 凸包+旋转卡壳
题目大意 用最小矩形覆盖平面上所有的点 分析 有一结论:最小矩形中有一条边在凸包的边上,不然可以旋转一个角度让面积变小 简略证明 我们逆时针枚举一条边 用旋转卡壳维护此时最左,最右,最上的点 注意 注 ...
- 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳
因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...
随机推荐
- iOS UIView 快速修改 frame
我们修改frame中的某个值,需要进行繁琐的书写,例如: (1). 直接设置位置大小 view.frame = CGRectMake(0, 0, 320, 150); (2). 只修改某个值 view ...
- jqGrid Tree
CSS: <!--jqGrid--><link rel="stylesheet" href="plugins/jqgird/css/ui.jqgrid. ...
- Js 赋值传值和引用传址
赋值传值和引用传址 在JavaScript中基本数据类型都是赋值传值,复合数据类型都是引用传址(传地址) 基本数据类型的变量名和数据是直接存在"快速内存"(栈内存)中,而复合数据类 ...
- 通过Curator操作Zookeeper的简单例子代码
Curator主要解决了三类问题: 一个是ZooKeeper client与ZooKeeper server之间的连接处理; 一个是提供了一套Fluent风格的操作API; 一个是ZooKeeper各 ...
- spring aop配置及用例说明(1)
欢迎转载交流,博客地址http://www.cnblogs.com/shizhongtao/p/3469776.html 首先,什么是aop,其实通俗一点讲就是,再方法执行时候我们加入其它业务逻辑.比 ...
- (poj 3177) Redundant Paths
题目链接 :http://poj.org/problem?id=3177 Description In order to <= F <= ,) grazing fields (which ...
- 《C++ Qt 设计模式》8|15拼图 小游戏的简单实现。拜托,别乱点!
第零章:介绍 看到这个游戏了,感觉蛮好玩的,实现了一下. 界面如下: 游戏玩法:在3×*3的矩阵中,每个按钮都可以点击,如果按钮四周有一个是空白,则点击此按钮则会移动到这个空白.按钮字母顺序变成“AB ...
- 一.Nginx的特性和一些知识点
一.Nginx的特性和一些知识点 1.基本功能服务器 处理静态文件(静态资源的web),支持 反向代理服务器,支持缓存.负载均衡.支持FastCGI 模块化机制,非DOS机制,支持 ...
- manifest save for self
一.使用html5的缓存机制 1.先上规则代码:m.manifest CACHE MANIFEST # 2015-04-24 14:20 #直接缓存的文件 CACHE: /templates/spec ...
- DTCMS自定义标签:获取所有栏目以及不显示指定栏目
DTcms.Web.UI\Label\category.cs中 添加下面代码 /// <summary> /// 返回所有类别 /// </summary> /// <r ...

