BZOJ:1185: [HNOI2007]最小矩形覆盖
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]最小矩形覆盖的更多相关文章
- 洛谷 P3187 BZOJ 1185 [HNOI2007]最小矩形覆盖 (旋转卡壳)
题目链接: 洛谷 P3187 [HNOI2007]最小矩形覆盖 BZOJ 1185: [HNOI2007]最小矩形覆盖 Description 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形, ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1435 Solve ...
- bzoj 1185 [HNOI2007]最小矩形覆盖 凸包+旋转卡壳
题目大意 用最小矩形覆盖平面上所有的点 分析 有一结论:最小矩形中有一条边在凸包的边上,不然可以旋转一个角度让面积变小 简略证明 我们逆时针枚举一条边 用旋转卡壳维护此时最左,最右,最上的点 注意 注 ...
- ●BZOJ 1185 [HNOI2007]最小矩形覆盖
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解: 计算几何,凸包,旋转卡壳 结论:矩形的某一条边在凸包的一条边所在的直线上. ( ...
- BZOJ 1185 [HNOI2007]最小矩形覆盖:凸包 + 旋转卡壳
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 题意: 给出二维平面上的n个点,问你将所有点覆盖的最小矩形面积. 题解: 先找出凸 ...
- bzoj 1185 [HNOI2007]最小矩形覆盖——旋转卡壳
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 矩形一定贴着凸包的一条边.不过只是感觉这样. 枚举一条边,对面的点就是正常的旋转卡壳. ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖-旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标-备忘板子
来源:旋转卡壳法求点集最小外接矩形(面积)并输出四个顶点坐标 BZOJ又崩了,直接贴一下人家的代码. 代码: #include"stdio.h" #include"str ...
- BZOJ 1185 [HNOI2007]最小矩形覆盖 ——计算几何
程序写的太垃圾,卡不过去. GG,甘拜下风. #include <map> #include <cmath> #include <queue> #include & ...
- 1185: [HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1426 Solve ...
随机推荐
- 小白的Python之路 day1 表达式if ... else ,while循环,for循环
表达式if ... else 一.用户登陆验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 提示输入用户名和密码 # 验 ...
- docker入门【1】
1.拉取镜像 docker pull 镜像名:版本号 例如:docker pull tomcat:7.0 默认会从docker官方镜像库拉取,不指定版本的话版本为latest 拉取后docker im ...
- [HDU - 5170GTY's math problem 数的精度类
题目链接:HDU - 5170GTY's math problem 题目描述 Description GTY is a GodBull who will get an Au in NOI . To h ...
- @Data 注解引出的 lombok 小辣椒
今天在看代码的时候, 看到了这个注解, 之前都没有见过, 所以就查了下, 发现还是个不错的注解, 可以让代码更加简洁. 这个注解来自于 lombok,lombok 能够减少大量的模板代码,减少了在使用 ...
- base64格式图片转换为FormData对象进行上传
原理:理由ArrayBuffer.Blob和FormData var base64String = /*base64图片串*/; //这里对base64串进行操作,去掉url头,并转换为byte va ...
- 记录优雅的pythonic代码
记录平时学习中接触到的和网上看到的一些pythonic的方法,只为日后查询时候方便. 1.列表推导式: seq_list=[1,2,3,4,5] new_list=[i *2 for i in seq ...
- [HNOI2008]Cards
题目描述 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案. 进一步,小春要求染出Sr张红色,Sb张蓝 ...
- Django__WSGI
WEB应用的本质 : 1. 浏览器发送一个http请求 2. 服务器收到请求,生成一个html文档 3. 服务器把HTML文档作为HTTP响应的body发送给浏览器 4. 浏览器收到http响应,从h ...
- XCopy命令实现增量备份
xcopy XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝系统文件:使用时源盘符.源目标路径名.源文件名至少指定一个:选用/S时对源目录下及其子目录下的所有文件进行C ...
- AVFoundation 框架初探究(一)
夜深时动笔 前面一篇文章写了视频播放的几种基本的方式,算是给这个系列开了一个头,这里面最想说和探究的就是AVFoundation框架,很想把这个框架不敢说是完全理解,但至少想把它弄明白它里面到底有什么 ...