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】 凸包+旋转卡壳的更多相关文章

  1. bzoj 1069 凸包+旋转卡壳

    题目大意 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成 的多边形面积最大. 分析 枚举对角线的一个端点 另一个端点开始转 转的时候求出对角线左边面积 ...

  2. [USACO2003][poj2187]Beauty Contest(凸包+旋转卡壳)

    http://poj.org/problem?id=2187 题意:老题了,求平面内最远点对(让本渣默默想到了悲剧的AHOI2012……) 分析: nlogn的凸包+旋转卡壳 附:http://www ...

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

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

  4. Code Chef GEOCHEAT(凸包+旋转卡壳+随机化)

    题面 传送门 题解 以下记\(S_i=\{1,2,3,...,i\}\) 我们先用凸包+旋转卡壳求出直径的长度,并记直径的两个端点为\(i,j\)(如果有多条直径随机取两个端点) 因为这个序列被\(r ...

  5. poj 2079 Triangle (二维凸包旋转卡壳)

    Triangle Time Limit: 3000MS   Memory Limit: 30000KB   64bit IO Format: %I64d & %I64u Submit Stat ...

  6. poj 2187 Beauty Contest(二维凸包旋转卡壳)

    D - Beauty Contest Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  7. POJ 2187 凸包+旋转卡壳

    思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说   凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...

  8. BZOJ 1185 [HNOI2007]最小矩形覆盖:凸包 + 旋转卡壳

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 题意: 给出二维平面上的n个点,问你将所有点覆盖的最小矩形面积. 题解: 先找出凸 ...

  9. bzoj 1185 [HNOI2007]最小矩形覆盖 凸包+旋转卡壳

    题目大意 用最小矩形覆盖平面上所有的点 分析 有一结论:最小矩形中有一条边在凸包的边上,不然可以旋转一个角度让面积变小 简略证明 我们逆时针枚举一条边 用旋转卡壳维护此时最左,最右,最上的点 注意 注 ...

  10. 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳

    因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...

随机推荐

  1. 第九篇、Swift的基本使用

    1.访问权限 /* 1> internal : 内部的 1. 默认情况下所有的类&属性&方法的访问权限都是internal 2. 在本模块(项目/包/target)中可以访问 2 ...

  2. Cocos开发中性能优化工具介绍之使用Windows任务管理器

    说到Windows平台,我们很快就想到了Visual Studio 2012,然而Visual Studio 2012在这方面没有很好的工具.如果我们只是想知道大体上内存.CPU等在某一事件前后变化情 ...

  3. Tab 防刷新

    今天发现项目中有个小毛病,就是tab老是刷新,就上网Copy了一份防止刷新的Tab例子,谢咯. 贴上来参考一下: <!DOCTYPE html PUBLIC "-//W3C//DTD ...

  4. js中元素操作的有关内容与对比

    以下 A:代表原生js B:代表jQuery 1 创建元素/节点 A: 元素节点- createElement( ) 文本节点 - createTextNode() 例如: var a = docum ...

  5. Normalize [ 浏览器渲染格式化 ]

    /*! normalize.css v3.0.2 | MIT License | git.io/normalize */ /** * 1. Set default font family to san ...

  6. encodeURIComponent=>Uri.EscapeDataString

    javascript: encodeURIComponent=> C#: Uri.EscapeDataString http://stackoverflow.com/questions/5754 ...

  7. 如何Angularjs1.3在页面中输出带Html标记的文本

    基于安全考虑,Angularjs不允许用ng-bind或者{{}}的方法输出html文本. 在实际的应用中,比如信息管理系统,用在线编辑器编辑出来的文章都带有html标记,这种情况下可以用ng-bin ...

  8. input内容改变触发事件,兼容IE

    <html> <head> <script type="text/javascript"> window.onload = function() ...

  9. StreamReader和StreamWrite与FileStream区别

    具体用法不在赘述. 记录一下用法的区别 StreamReader: FileStream fs = new FileStream(@"D:\Readme.txt",FileMode ...

  10. <script type="text/html"></script> js模版使用

    <div></div> <script type="text/html" id="javascript_template"> ...