http://www.lydsy.com/JudgeOnline/problem.php?id=1185

题解去看它

http://www.cnblogs.com/TheRoadToTheGold/p/8253800.html

精度真是卡的我醉生梦死,w(゚Д゚)w    O(≧口≦)O

bzoj改成long double 就过了

洛谷仍处于

输出x.99999,答案输出x+1.00000

输出-0.00000,答案输出0.00000

救命啊~~~~(>_<)~~~~

来自大佬的建议:输出double时用%f

#include<cmath>
#include<cstdio>
#include<algorithm> #define N 50001 using namespace std; const long double eps=1e-; int dcmp(long double x)
{
if(fabs(x)<eps) return ;
return x< ? - : ;
} struct Point
{
long double x,y; Point(long double x=,long double y=) : x(x),y(y) { } bool operator < (Point p) const
{
if(!dcmp(x-p.x)) return y<p.y;
return x<p.x;
} bool operator == (Point p) const
{
return !dcmp(x-p.x) && !dcmp(y-p.y);
}
}; typedef Point Vector; Point P[N],C[N]; Point AnsP[]; Vector operator + (Vector A,Vector B) { return Vector(A.x+B.x,A.y+B.y); }
Vector operator - (Vector A,Vector B) { return Vector(A.x-B.x,A.y-B.y); }
Vector operator * (Vector A,double q) { return Vector(A.x*q,A.y*q); } long double Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
} long double Area2(Point A,Point B,Point D)
{
return Cross(B-A,D-A);
} long double Dot(Vector A,Vector B)
{
return A.x*B.x+A.y*B.y;
} long double Length(Vector A)
{
return sqrt(Dot(A,A));
} int ConvexHull(Point *p,int n,Point *c)
{
sort(p,p+n);
n=unique(p,p+n)-p;
int m=;
for(int i=;i<n;++i)
{
while(m> && Cross(c[m-]-c[m-],p[i]-c[m-])<=) m--;
c[m++]=p[i];
}
int k=m;
for(int i=n-;i>=;--i)
{
while(m>k && Cross(c[m-]-c[m-],p[i]-c[m-])<=) m--;
c[m++]=p[i];
}
m--;
return m;
} long double getdis(Point A,Point B)
{
return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
} void RotatingCaliper(Point *c,int m)
{
long double AnsArea=1e20,AnsPeri=1e20;
int q=,l=,r=;
long double d,h,w,rw;
for(int p=;p<m;++p)
{
while(fabs(Cross(c[p]-c[p+],c[q+]-c[p+]))>fabs(Cross(c[p]-c[p+],c[q]-c[p+]))) q=(q+)%m;
while(dcmp(Dot(c[p+]-c[p],c[r+]-c[r]))>)
r=(r+)%m;
if(!l) l=q;
while(dcmp(Dot(c[p+]-c[p],c[l+]-c[l]))<)
l=(l+)%m;
d=Length(c[p+]-c[p]);
h=fabs(Area2(c[p],c[p+],c[q]))/d;
w=Dot(c[p+]-c[p],c[r]-c[l])/d;
rw=Dot(c[r]-c[p],c[p+]-c[p])/d;
if(w*h<AnsArea)
{
AnsArea=w*h;
AnsP[]=c[p]+(c[p+]-c[p])*(rw/d);
AnsP[]=AnsP[]+(c[r]-AnsP[])*(h/getdis(c[r],AnsP[]));
AnsP[]=AnsP[]+(c[q]-AnsP[])*(w/getdis(c[q],AnsP[]));
AnsP[]=AnsP[]+(c[l]-AnsP[])*(h/getdis(c[l],AnsP[]));
}
}
double out=AnsArea;
printf("%.5lf\n",out);
} bool less(Point A,Point B)
{
if(!dcmp(A.y-B.y)) return A.x<B.x;
return A.y<B.y;
} int main()
{
int n,m;
scanf("%d",&n);
double x,y;
for(int i=;i<n;++i)
{
scanf("%lf%lf",&x,&y);
P[i]=Point(x,y);
}
m=ConvexHull(P,n,C);
RotatingCaliper(C,m);
int s=;
for(int i=;i<;++i)
if(less(AnsP[i],AnsP[s])) s=i;
double outx,outy;
for(int i=;i<;++i)
{
if(!dcmp(AnsP[(i+s)%].x)) AnsP[(i+s)%].x=;
if(!dcmp(AnsP[(i+s)%].y)) AnsP[(i+s)%].y=;
outx=AnsP[(i+s)%].x+eps;
outy=AnsP[(i+s)%].y+eps;
printf("%.5lf %.5lf\n",outx,outy);
}
}

bzoj千题计划209:bzoj1185: [HNOI2007]最小矩形覆盖的更多相关文章

  1. BZOJ1185[HNOI2007] 最小矩形覆盖(旋转卡壳)

    BZOJ1185[HNOI2007] 最小矩形覆盖 题面 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点的坐标 分析 首先可以先求凸包,因为覆盖了凸包上的顶点,凸 ...

  2. bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包

    [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2081  Solved: 920 ...

  3. BZOJ1185 [HNOI2007]最小矩形覆盖 【旋转卡壳】

    题目链接 BZOJ1185 题解 最小矩形一定有一条边在凸包上,枚举这条边,然后旋转卡壳维护另外三个端点即可 计算几何细节极多 维护另外三个端点尽量不在这条边上,意味着左端点尽量靠后,右端点尽量靠前, ...

  4. [BZOJ1185][HNOI2007]最小矩形覆盖-[凸包+旋转卡壳]

    Description 传送门 Solution 感性理解一下,最小矩形一定是由一条边和凸包上的边重合的. 然后它就是模板题了..然而真的好难调,小于大于动不动就打错. Code #include&l ...

  5. 2018.10.18 bzoj1185: [HNOI2007]最小矩形覆盖(旋转卡壳)

    传送门 不难看出最后的矩形一定有一条边与凸包某条边重合. 因此先求出凸包,然后旋转卡壳求出当前最小矩形面积更新答案. 代码: #include<bits/stdc++.h> #define ...

  6. BZOJ1185 : [HNOI2007]最小矩形覆盖

    求出凸包后,矩形的一条边一定与凸包的某条边重合. 枚举每条边,求出离它最远的点和离它最左最右的点,因为那三个点是单调变化的,所以复杂度为$O(n)$. 注意精度. #include<cstdio ...

  7. BZOJ1185 HNOI2007 最小矩形覆盖 凸包、旋转卡壳

    传送门 首先,肯定只有凸包上的点会限制这个矩形,所以建立凸包. 然后可以知道,矩形上一定有一条边与凸包上的边重合,否则可以转一下使得它重合,答案会更小. 于是沿着凸包枚举这一条边,通过旋转卡壳找到离这 ...

  8. 【BZOJ1185】[HNOI2007]最小矩形覆盖(凸包,旋转卡壳)

    [BZOJ1185][HNOI2007]最小矩形覆盖(凸包,旋转卡壳) 题面 BZOJ 洛谷 题解 最小的矩形一定存在一条边在凸包上,那么枚举这条边,我们还差三个点,即距离当前边的最远点,以及做这条边 ...

  9. 洛谷 P3187 BZOJ 1185 [HNOI2007]最小矩形覆盖 (旋转卡壳)

    题目链接: 洛谷 P3187 [HNOI2007]最小矩形覆盖 BZOJ 1185: [HNOI2007]最小矩形覆盖 Description 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形, ...

随机推荐

  1. flask_admin 笔记二 授权和权限

    权限当然就是让有应该权限的用户能执行某些操作,把没有权限的用户限制在外面.Flask-admin提供了几种方法来处理: 1, Http basic Auth 最简单的身份验证形式是HTTP基本身份验证 ...

  2. 浅谈android Service和BroadCastReceiver

    1.题记 Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序. 广播接收者(BroadcastRece ...

  3. Win7远程桌面的多用户连接破解

    系统是 64位WIN7 旗舰版 每当我用其它机器连WIN7的3389远程桌面时,WIN7那台机子就会退出到注销用户后的状态了,后来我新建了个用户,用不同用户登陆还是退出,也就是说不能同时2个人操作电脑 ...

  4. sql注入语句整理

    1.判断有无注入点; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等..and 0<>(select ...

  5. 微软职位内部推荐-Senior Software Engineer - Back End

    微软近期Open的职位: SharePoint is a multi-billion dollar enterprise business that has grown from an on-prem ...

  6. Individual Project Records

    At the midnight of September 20, I finished my individual projcet -- a word frequency program. You c ...

  7. LINUX内核分析第二周学习总结——操作系统是如何工作的

    LINUX内核分析第二周学习总结——操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...

  8. c语言四则运算

    #include<stdio.h>#define W 5main(){ int a,b,i=0,c,d,r=0; while(i<W) { i++; srand(time()); a ...

  9. Alpha 冲刺一

    团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 界面(简陋) 登录界 ...

  10. Alpha 冲刺十

    团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 完善各自部分 项目描 ...