题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1185

枚举一条边,维护上、左、右方的点;

上方点到这条边距离最远,所以用叉积求面积维护;

左右点到这条边的射影最长(!),所以用点积求射影维护;

因为维护的点是只能逆时针走的,所以初始的左边点要特殊处理一下,其实等于右边点即可,然后可以走过去到合适位置;

然后维护矩形的四个端点,就是根据距离,从边的端点走过去,还挺有意思的;

注意不要输出 -0;

然而这其实是假的呵呵,Narh 一拍就出错了,还是很小的数据很明显的错囧

只是不知道哪里错,怎么调...

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef double db;
db const eps=1e-;
int const xn=;
int n;
db ans;
int dmp(db x){if(fabs(x)<=eps)return ; return x>eps?:-;}
struct P{
db x,y;
P(db x=,db y=):x(x),y(y) {}
bool operator < (const P &b) const
{return dmp(x-b.x)<||dmp(x-b.x)==&&dmp(y-b.y)<;}
P operator + (const P &b) const
{return P(x+b.x,y+b.y);}
P operator - (const P &b) const
{return P(x-b.x,y-b.y);}
P operator * (const db &v) const
{return P(x*v,y*v);}
P operator / (const db &v) const
{return P(x/v,y/v);}
}p[xn],c[xn],pos[];
db cross(P a,P b){return a.x*b.y-a.y*b.x;}
db dot(P a,P b){return a.x*b.x+a.y*b.y;}
void find()
{
sort(p+,p+n+); int top=;
for(int i=;i<=n;i++)
{
while(top>&&dmp(cross(c[top]-c[top-],p[i]-c[top]))<=)top--;
c[++top]=p[i];
}
int num=top;
for(int i=n-;i;i--)
{
while(top>num&&dmp(cross(c[top]-c[top-],p[i]-c[top]))<=)top--;
c[++top]=p[i];
}
n=top-;
}
int upt(int x){if(x>n)x-=n; if(x<)x+=n; return x;}
db sqr(db x){return x*x;}
db dis(P a,P b){return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
bool cmp(P a,P b){return dmp(a.y-b.y)<||(dmp(a.y-b.y)==&&dmp(a.x-b.x)<);}
void rc()
{
ans=-;
//int p=2,l=1,r=2;//
int p=,l=,r=; c[n+]=c[];
for(int i=;i<=n;i++)
{
db d=dis(c[i],c[i+]);
while(dmp(cross(c[i]-c[p],c[i+]-c[p])-cross(c[i]-c[p+],c[i+]-c[p+]))<=)p=upt(p+);
while(dmp(dot(c[r]-c[i],c[i+]-c[i])-dot(c[r+]-c[i],c[i+]-c[i]))<=)r=upt(r+);
if(i==)l=r;//
while(dmp(dot(c[l]-c[i],c[i+]-c[i])-dot(c[l+]-c[i],c[i+]-c[i]))>=)l=upt(l+);
db L=dot(c[i+]-c[i],c[l]-c[i])/d;
db R=dot(c[i+]-c[i],c[r]-c[i])/d;
db H=cross(c[i]-c[p],c[i+]-c[p])/d;
db tmp=(R-L)*H;
if(ans<||dmp(ans-tmp)>)
{
ans=tmp;
pos[]=c[i]+(c[i+]-c[i])*(R/d);
pos[]=pos[]+(c[r]-pos[])*(H/dis(c[r],pos[]));
//pos[2]=pos[1]+(c[p]-pos[1])*((R-L)/dis(c[p],pos[1]));//也可
pos[]=pos[]+(c[i]-pos[])*((R-L)/dis(c[i],pos[]));
pos[]=pos[]+(pos[]-pos[]);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
find();
rc();
printf("%.5f\n",ans);
int st=;
for(int i=;i<;i++)if(cmp(pos[i],pos[st]))st=i;
for(int i=st,cnt=;cnt<=;i=(i+)%,cnt++)
{
if(fabs(pos[i].x)<=eps)pos[i].x=;
if(fabs(pos[i].y)<=eps)pos[i].y=;
printf("%.5f %.5f\n",pos[i].x,pos[i].y);
}
return ;
}

bzoj 1185 最小矩形覆盖 —— 旋转卡壳的更多相关文章

  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. bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包

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

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

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

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

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

  6. 【bzoj1185】[HNOI2007]最小矩形覆盖 (旋转卡壳)

    给你一些点,让你用最小的矩形覆盖这些点 首先有一个结论,矩形的一条边一定在凸包上!!! 枚举凸包上的边 用旋转卡壳在凸包上找矩形另外三点... 注意精度问题 #include<cstdio> ...

  7. BZOJ 1185 最小矩形覆盖

    Description Input Output Sample Input Sample Output HINT 其实这题就是一道旋转卡壳的裸题,但是我的精度萎了.直接上hzwer的代码吧... #i ...

  8. HDU 5251 矩形面积 (旋转卡壳)

    2015年百度之星程序设计大赛 - 初赛(1) 1006 比赛链接:2015年百度之星程序设计大赛 - 初赛(1) 题目链接:HDU 5251 Problem Description 小度熊有一个桌面 ...

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

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

随机推荐

  1. 九度OJ 1249:次小生成树 (次小生成树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:203 解决:56 题目描述: 最小生成树大家都已经很了解,次小生成树就是图中构成的树的权值和第二小的树,此值也可能等于最小生成树的权值和,你 ...

  2. 九度OJ 1214:丑数 (整除)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2180 解决:942 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因 ...

  3. js跨浏览器复制: ZeroClipboard

    实例结构: demo.html <script type="text/javascript" src='http://code.jquery.com/jquery.js'&g ...

  4. Mybatis sql注入问题

    预编译方式,即PreparedStatement,可以防注入:#{id} <select id="getBlogById" resultType="Blog&quo ...

  5. dig指定服务器查询域名解析时间

    time=$(dig @8.8.8.8 baidu.com | grep Query | awk '{print $4}') echo $time 一 nslookup指定服务器查询域名解析时间 ro ...

  6. latex安装

    这里使用的是texlive + winedt方式 下载texlive2018, 使用window的bat文件安装,选项选择如下 具体配置可以参考如下网址 https://blog.csdn.net/w ...

  7. 私有云的迁移:从VMware到OpenStack

    VMware和OpenStack经常被描述为相互竞争的两种私有云技术.虽然这两种技术其实可以互补,但一些组织却选择从VMware迁移到OpenStack的私有云上. 让我们来看看这些组织如何能同时使用 ...

  8. Windows命令行(DOS命令)教程

    一.命令行简介 命令行就是在Windows操作系统中打开DOS窗口,以字符串的形式执行Windows管理程序. 在这里,先解释什么是DOS? DOS——Disk Operation System 磁盘 ...

  9. zabbix实现mysql数据库的监控(四)

    前面介绍的内容都是用第三方开发好的插件进行mysql监控的,可能有些我们关心的监控内容并不在其中,这时一种常用的方法就是定义我们自己的脚本并将它整合到zabbix中,从而在原有监控的基础上进行有力的补 ...

  10. render总结

    vue渲染组件的顺序是: 执行render函数-->没有render参数解析template参数内容-->没有template参数将el内html当做template解析 其中解析temp ...