[BZOJ1185][HNOI2007]最小矩形覆盖-[凸包+旋转卡壳]
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]最小矩形覆盖-[凸包+旋转卡壳]的更多相关文章
- BZOJ1185[HNOI2007] 最小矩形覆盖(旋转卡壳)
BZOJ1185[HNOI2007] 最小矩形覆盖 题面 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点的坐标 分析 首先可以先求凸包,因为覆盖了凸包上的顶点,凸 ...
- BZOJ1185 [HNOI2007]最小矩形覆盖 【旋转卡壳】
题目链接 BZOJ1185 题解 最小矩形一定有一条边在凸包上,枚举这条边,然后旋转卡壳维护另外三个端点即可 计算几何细节极多 维护另外三个端点尽量不在这条边上,意味着左端点尽量靠后,右端点尽量靠前, ...
- bzoj 1185 [HNOI2007]最小矩形覆盖 凸包+旋转卡壳
题目大意 用最小矩形覆盖平面上所有的点 分析 有一结论:最小矩形中有一条边在凸包的边上,不然可以旋转一个角度让面积变小 简略证明 我们逆时针枚举一条边 用旋转卡壳维护此时最左,最右,最上的点 注意 注 ...
- 2018.10.18 bzoj1185: [HNOI2007]最小矩形覆盖(旋转卡壳)
传送门 不难看出最后的矩形一定有一条边与凸包某条边重合. 因此先求出凸包,然后旋转卡壳求出当前最小矩形面积更新答案. 代码: #include<bits/stdc++.h> #define ...
- [HNOI2007][BZOJ1185] 最小矩形覆盖 [凸包+旋转卡壳]
题面 BZOJ题面 前置芝士 建议先学习向量相关的计算几何基础 计算几何基础戳这里 思路 用这道题学习一下凸包和旋转卡壳 首先是凸包部分 凸包 求凸包用的算法是graham算法 算法流程如下: 找到$ ...
- BZOJ1185 HNOI2007 最小矩形覆盖 凸包、旋转卡壳
传送门 首先,肯定只有凸包上的点会限制这个矩形,所以建立凸包. 然后可以知道,矩形上一定有一条边与凸包上的边重合,否则可以转一下使得它重合,答案会更小. 于是沿着凸包枚举这一条边,通过旋转卡壳找到离这 ...
- bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包
[HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 2081 Solved: 920 ...
- BZOJ1185 : [HNOI2007]最小矩形覆盖
求出凸包后,矩形的一条边一定与凸包的某条边重合. 枚举每条边,求出离它最远的点和离它最左最右的点,因为那三个点是单调变化的,所以复杂度为$O(n)$. 注意精度. #include<cstdio ...
- bzoj千题计划209:bzoj1185: [HNOI2007]最小矩形覆盖
http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解去看它 http://www.cnblogs.com/TheRoadToTheGold/p ...
随机推荐
- Android Studio 动态调试 apk 反编译出的 smali 代码
在信安大赛的准备过程中,主要通过 Android Studio 动态调试 apk 反编译出来的 smali 代码的方式来对我们分析的执行流程进行验证.该技巧的主要流程在此记录.以下过程使用 Andro ...
- css3优惠券
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" /> <title&g ...
- 语法规范:BNF与ABNF 巴斯克范式
语法规范:BNF与ABNF 巴斯克范式 BNF 巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语 ...
- 【[IOI2014]Wall 砖墙】
好像随便一卡就最优解了 malao告诉我这道题挺不错的,于是就去写了写 这两个操作很有灵性啊,感觉这么有特点的数大概是需要分块维护的吧 但是并没有什么区间查询,只是在最后输出整个序列 于是我们就直接用 ...
- [USACO08JAN]Telephone Lines
嘟嘟嘟 题意概括一下,就是在无向图上求一条1到n的路径,使路径上第k + 1大的边权尽量小. 考虑dp,令dp[i][j] 表示走到节点 i,路线上有 j 条电话线免费时,路径上最贵的电缆花费最小是多 ...
- nextjs-demo
这个是根据nextjs服务端渲染做的一个小demo 关键性代码,主要是控制模态框显示隐藏 关于index页面 //index.js /* eslint-disable jsx-a11y/anchor- ...
- Linux常用监控服务器性能命令
列举比较常用的几种监控服务器性能的Linux命令.其实,在我看来,目前针对Linux系统内存.硬盘.TCP/IP等等相关的指标,Linux本身自带的或者是一些开源项目等基本上都能达到这个获取服务器性能 ...
- iOS的AssetsLibrary框架访问所有相片
该框架下有几个类,ALAssetsLibrary,ALAssetsGroup,ALAsset,ALAssetsFilter,ALAssetRepresentation. ALAssetsLibrary ...
- POJ 2524 独一无二的宗教(裸并查集)
题目链接: http://poj.org/problem?id=2524 Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K ...
- DBA手记-BBED 的说明
在10g中连接生成bbed:cd $ORACLE_HOME/rdbms/libmake -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed 11g中缺省未提供BBE ...