Description

传送门

Solution

感性理解一下,最小矩形一定是由一条边和凸包上的边重合的。

然后它就是模板题了。。然而真的好难调,小于大于动不动就打错。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-;
int n;
struct node{double x,y;
friend node operator +(node a,node b){return node{a.x+b.x,a.y+b.y};}
friend node operator -(node a,node b){return node{a.x-b.x,a.y-b.y};}
friend double operator *(node a,node b){return a.x*b.y-a.y*b.x;}
friend double operator /(node a,node b){return a.x*b.x+a.y*b.y;}
friend node operator *(node a,double b) {return node{a.x*b,a.y*b};}
friend bool operator <(node a,node b) { return fabs(a.y-b.y)<eps?a.x<b.x:a.y<b.y;}
}p[],st[],low;
double dis(node a){return a.x*a.x+a.y*a.y;}
bool cmp(node a,node b){
double t=(a-p[])*(b-p[]);
if (fabs(t)<eps) return dis(a-p[])<dis(b-p[]);
return t>;
}
int top=,now;
int main()
{
scanf("%d",&n);
low.x=low.y=;
scanf("%lf%lf",&p[].x,&p[].y);
for (int i=;i<=n;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
if (p[i]<p[]) swap(p[i],p[]);
}
sort(p+,p+n+,cmp);
st[++top]=p[];
for (int i=;i<=n;i++)
{
while (top>&&(st[top]-st[top-])*(p[i]-st[top])<eps) top--;
st[++top]=p[i];
}
st[]=st[top];
node pr[];
double L,R,D,H,ans=1e10;int l=,r=,now=;
for (int i=;i<top;i++)
{
D=sqrt(dis(st[i]-st[i+]));
while ((st[i+]-st[i])*(st[now+]-st[i])>(st[i+]-st[i])*(st[now]-st[i])-eps) now=(now+)%top;
while ((st[i+]-st[i])/(st[r+]-st[i])>(st[i+]-st[i])/(st[r]-st[i])-eps) r=(r+)%top;
if (!i) l=r;
while ((st[i+]-st[i])/(st[l+]-st[i])<(st[i+]-st[i])/(st[l]-st[i])+eps) l=(l+)%top;
L=(st[i+]-st[i])/(st[l]-st[i])/D;R=(st[i+]-st[i])/(st[r]-st[i])/D;
H=abs((st[i+]-st[i])*(st[now]-st[i])/D);
if ((R-L)*H<ans)
{
ans=(R-L)*H;
pr[]=st[i]+(st[i+]-st[i])*(R/D);
pr[]=pr[]+(st[r]-pr[])*(H/sqrt(dis(pr[]-st[r])));
pr[]=pr[]-(pr[]-st[i])*((R-L)/sqrt(dis(st[i]-pr[])));
pr[]=pr[]-(pr[]-pr[]);
}
}
now=;
for (int i=;i<=;i++) if (pr[i]<pr[now]) now=i;
printf("%.5f\n",ans);
for (int i=;i<=;i++)
{
if (pr[(i+now)%].x>-*1e-) pr[(i+now)%].x=fabs(pr[(i+now)%].x);
if (pr[(i+now)%].y>-*1e-) pr[(i+now)%].y=fabs(pr[(i+now)%].y);
printf("%.5f %.5f\n",pr[(i+now)%].x,pr[(i+now)%].y);
}
}

[BZOJ1185][HNOI2007]最小矩形覆盖-[凸包+旋转卡壳]的更多相关文章

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

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

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

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

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

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

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

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

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

    题面 BZOJ题面 前置芝士 建议先学习向量相关的计算几何基础 计算几何基础戳这里 思路 用这道题学习一下凸包和旋转卡壳 首先是凸包部分 凸包 求凸包用的算法是graham算法 算法流程如下: 找到$ ...

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

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

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

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

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

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

  9. bzoj千题计划209:bzoj1185: [HNOI2007]最小矩形覆盖

    http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解去看它 http://www.cnblogs.com/TheRoadToTheGold/p ...

随机推荐

  1. Linux服务器磁盘空间占满问题

    下面我们一起来看一篇关于Linux服务器磁盘占满问题解决(/dev/sda3 满了),希望碰到此类问题的人能带来帮助.   今天下班某电商技术部leader发现个问题,说他们服务器硬盘满了.把日志文件 ...

  2. BZOJ 2038 小Z的袜子(hose) 莫队算法模板题

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题目大意: 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中 ...

  3. BZOJ3174:[TJOI2013]拯救小矮人(DP)

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  4. [HNOI2010]公交线路

    题目 发现\(n\)比较大,但是\(k,p\)都很小,考虑矩乘使得复杂度倾斜一下 发现所有车的最大间隔都是\(p\),还保证\(k<p\),于是我们可以考虑压下最后\(p\)位的情况 于是设\( ...

  5. zookeeper启动时报错:Error contacting service. It is probably not running问题

    查看zookeeper.out发现启动日志报错未找到java路径. 启动日志位于zookeeper-4.0.10/bin目录下 修改/etc/profile中环境变量得以解决.

  6. 分布式一致性协议-2PC与3PC(二)

    一.分布式一致性 一个事务需要跨多个分布式节点,又要保持事务的ACID特性,需要引入协调者来统一调度所有分布式节点的执行逻辑,被调度的节点称为参与者. 协调者负责调用参与者,并决定最终是否提交事务.基 ...

  7. cocos2dx lua 一键资源管理PowerShell脚本实现

    特别说明 此管理脚本不包含图片资源加密,热更新资源文件列表是md5 和 文件路径构成的txt,如下 脚本文件是放在和res src 同级的文件夹里面 脚本内容如下 clear $PSDefaultPa ...

  8. form组件-字段

    Form类 创建Form类时,主要涉及到 [字段] 和 [插件],字段用于对用户请求数据的验证,插件用于自动生成HTML 1.Django内置字段如下: Field required=True, 是否 ...

  9. LR--用栈实现移进--归约分析(demo)

    1.考虑文法 \(E->E+E\) \(E->E*E\) \(E->id\) 2.最右推导 不难看出,这个文法是而二义的,所以有多个最右推导 3.移进归约 用一个栈存文法符号,用输入 ...

  10. CentOS7进行OpenStack(queens)最小化部署实验出现的问题与解决过程

    注:此文为<OpenStack(queens)最小化搭建记录——控制与计算共两个节点>的补充 1.chrony时间同步服务搭建的时候,出现计算节点无法与控制节点同步.(controller ...