1185: [HNOI2007]最小矩形覆盖

这计算几何……果然很烦……

发现自己不会旋转卡壳,补了下,然后发现求凸包也不会……

凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用斜率判定。

旋转卡壳:枚举一条边,用叉积和点积维护另外三条边(联系叉积和点积的几何意义,叉积最大即为对边,点积最大最小即为邻边)

找来5份标程对拍……啥?4个不同的输出,相同的两个完全是错的……

自己拍吧T_T(花了一下午)

神TM卡double

#include<cmath>
#include<cstdio>
#include<algorithm>
#define MN 510001
#define ld long double
#define eps 1e-9
using namespace std; struct po{ld x,y;}p[MN],a,b,MMH[];
ld mmh=/.;
int n,m,st[MN],top,j,k,l;
po operator - (po a,po b){return po{a.x-b.x,a.y-b.y};}
po operator + (po a,po b){return po{a.x+b.x,a.y+b.y};}
po operator * (po a,ld x){return po{a.x*x,a.y*x};}
inline ld ABS(ld x){return x<?-x:x;}
inline ld sqr(ld x){return x*x;}
inline ld dis(po a,po b){return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
inline ld dj(po a,po b){return a.y*b.x-b.y*a.x;}
inline ld dj(po a,po b,po c){return (b.y-a.y)*(c.x-a.x)-(c.y-a.y)*(b.x-a.x);}
inline ld dj(po a,po b,po c,po d){return (b.y-a.y)*(d.x-c.x)-(d.y-c.y)*(b.x-a.x);}
inline ld det(po a,po b){return a.x*b.x+a.y*b.y;}
inline ld det(po a,po b,po c){return (b.x-a.x)*(c.x-a.x)+(c.y-a.y)*(b.y-a.y);}
bool cmp(po a,po b){
ld t=dj(p[],a,b);
if (abs(t)>eps) return t<;else return dis(a,p[])<dis(b,p[]);
}
int main(){
register int i;
scanf("%d",&n);
for (i=;i<=n;i++) scanf("%Lf%Lf",&p[i].x,&p[i].y);
for (i=;i<=n;i++) if (p[i].y<p[].y||(p[i].y==p[].y&&p[i].x<p[].x)) swap(p[],p[i]);
sort(p+,p++n,cmp); for (top=,i=;i<=n;i++){
while (top>&&dj(p[st[top-]],p[st[top]],p[i])>=-eps) top--;
st[++top]=i;
}
st[]=st[top];st[top+]=st[];
for (i=,j=k=l=;i<=top;i++){
while (dj(p[st[i]],p[st[i+]],p[st[j]])+eps>dj(p[st[i]],p[st[i+]],p[st[j+]])) j=j==top?:j+; while (det(p[st[i]],p[st[i+]],p[st[k]])-eps<det(p[st[i]],p[st[i+]],p[st[k+]])) k=k==top?:k+; if (i==) l=k;
while (det(p[st[i]],p[st[i+]],p[st[l]])+eps>det(p[st[i]],p[st[i+]],p[st[l+]])) l=l==top?:l+; a=p[st[i+]]-p[st[i]];
ld D=dis(p[st[i]],p[st[i+]]);
ld H=ABS(det(p[st[k]]-p[st[i+]],a))/D+ABS(det(p[st[l]]-p[st[i]],a))/D+D;
a=p[st[i+]]-p[st[i]];a=po{-a.y,a.x};
ld W=(ABS(det(p[st[k]]-p[st[i]],a))+ABS(det(p[st[k]]-p[st[j]],a)))/D;
ld S=H*W;
if (S<mmh){
mmh=S;
a=p[st[i+]]-p[st[i]];
MMH[]=p[st[i+]]+(p[st[i+]]-p[st[i]])*(ABS(det(p[st[k]]-p[st[i+]],a))/D/D);
a=p[st[i+]]-p[st[i]];a=po{-a.y,a.x};
MMH[]=MMH[]+a*(W/D);
a=p[st[i+]]-p[st[i]];a=po{-a.x,-a.y};
MMH[]=MMH[]+a*(H/D);
a=p[st[i+]]-p[st[i]];a=po{a.y,-a.x};
MMH[]=MMH[]+a*(W/D);
}
}
printf("%.5Lf\n",mmh);
i=;
for (int j=;j<;j++)
if (MMH[j].y<MMH[i].y||(MMH[j].y==MMH[i].y&&MMH[j].x<MMH[i].x)) i=j;
for (int j=;j<;j++) printf("%.5Lf %.5Lf\n",ABS(MMH[(i+j)%].x),ABS(MMH[(i+j)%].y));
}

BZOJ:1185: [HNOI2007]最小矩形覆盖的更多相关文章

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

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

  2. BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1435  Solve ...

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

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

  4. ●BZOJ 1185 [HNOI2007]最小矩形覆盖

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解: 计算几何,凸包,旋转卡壳 结论:矩形的某一条边在凸包的一条边所在的直线上. ( ...

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

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

  6. bzoj 1185 [HNOI2007]最小矩形覆盖——旋转卡壳

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 矩形一定贴着凸包的一条边.不过只是感觉这样. 枚举一条边,对面的点就是正常的旋转卡壳. ...

  7. BZOJ 1185: [HNOI2007]最小矩形覆盖-旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标-备忘板子

    来源:旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标 BZOJ又崩了,直接贴一下人家的代码. 代码: #include"stdio.h" #include"str ...

  8. BZOJ 1185 [HNOI2007]最小矩形覆盖 ——计算几何

    程序写的太垃圾,卡不过去. GG,甘拜下风. #include <map> #include <cmath> #include <queue> #include & ...

  9. 1185: [HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1426  Solve ...

随机推荐

  1. 55、js对象

    在python中我们学习了面向对象,javascript也是一门面向对象语言,在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象. JavaScript的对象简 ...

  2. Java JTS & 空间数据模型

    空间数据模型 判断两个几何图形是否存在指定的空间关系.包括: 相等(equals).分离(disjoint).相交(intersect).相接(touches).交叉(crosses).包含于(wit ...

  3. 干货分享!关于APP导航菜单设计你应该了解的一切

    导航菜单是人机交互的最主要的桥梁和平台,主要作用是不让用户迷失方向.现在市面上产品的菜单栏种类繁多,到底什么样的才是优秀的导航菜单设计呢?好的菜单设计不仅能提升整个产品的用户体验,而且还能让用户耳目一 ...

  4. bzoj 4868: [Shoi2017]期末考试

    Description 有n位同学,每位同学都参加了全部的m门课程的期末考试,都在焦急的等待成绩的公布.第i位同学希望在第ti天 或之前得知所.有.课程的成绩.如果在第ti天,有至少一门课程的成绩没有 ...

  5. nova创建虚拟机源码分析系列之八 compute创建虚机

    /conductor/api.py _build_instance()  /conductor/rpcapi.py  _build_instance() 1 构造一些数据类型2 修改一些api版本信息 ...

  6. 用node搭建简单的静态资源管理器

    我们都知道,老牌的3p服务器都是自带静态资源管理器的.但是node不同,它没有web容器,它的路由地址和真实地址可以没有联系,所有node的优点,是可以把路由做得相当漂亮. 但静态资源管理器也是必不可 ...

  7. JFinal极速开发框架使用笔记

    记录第一次使用JFinal,从简单的框架搭建到增删改查,从自带的方法到正常框架习惯的使用方式. JFinal官网:http://www.jfinal.com/ JFinal 是基于 Java 语言的极 ...

  8. (转) Linux中profile、bashrc、bash_profile之间的区别和联系

    原文地址:http://blog.csdn.net/chenchong08/article/details/7833242 /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登 ...

  9. Volatile的作用

    众所周知,volatile关键字可以让线程的修改立刻通知其他的线程,从而达到数据一致的作用.那么它具体涉及到哪些内容呢? 关于缓存 计算机最大的存储空间就是磁盘(硬盘),但是访问的速度也是最慢的,价格 ...

  10. CSS3 转换2D transform

    Transform字面上就是变形,改变的意思.在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放scale和移动translate以及矩阵变形matrix.下面我们一 ...