1185: [HNOI2007]最小矩形覆盖 - BZOJ

就是一道凸包(枚举凸包的边作为矩形的一条边)的裸题,只是不太好打,所以犹豫到今天才打
不说了,说起AC都是泪啊,因为没有精度判断,没有判重(算距离时除0了)错了好久
拍了好久都和标称是一样的,因为我是随机生成数据,基本不可能有重复的点
代码请自动无视...193行pascal(都是一坨一坨的)
const
eps=1e-7;
var
x,y:array[..]of extended;
s:array[..]of longint;
p:array[..,..]of longint;
n,tot:longint;
sp:extended; procedure swap(var x,y:extended);
var
t:extended;
begin
t:=x;x:=y;y:=t;
end; function min(x,y:extended):extended;
begin
if x<y then exit(x);
exit(y);
end; function cj(x1,y1,x2,y2,x3,y3:extended):extended;
begin
exit((y1-y2)*(x3-x1)+(x2-x1)*(y3-y1));
end; function jl(x1,y1,x2,y2,x3,y3:extended):extended;
begin
exit(cj(x1,y1,x2,y2,x3,y3)/sqrt(sqr(x1-x2)+sqr(y1-y2)));
end; procedure jiao(var x,y:extended;x1,y1,x2,y2,x3,y3:extended);
begin
x3:=x3-x1;
y3:=y3-y1;
if abs(x2)<eps then
begin
x:=x1;
y:=y1+y3;
exit;
end;
if abs(y2)<eps then
begin
x:=x1+x3;
y:=y1;
exit;
end;
x2:=y2/x2;
y3:=y3+x3/x2;
x3:=-/x2;
x:=y3/(x2-x3);
y:=x*x2;
x:=x+x1;
y:=y+y1;
end; procedure sort(l,r:longint);
var
i,j:longint;
xi,yi:extended;
begin
i:=l;
j:=r;
xi:=x[(l+r)>>];
yi:=y[(l+r)>>];
repeat
while (cj(x[],y[],xi,yi,x[i],y[i])<)and(abs(cj(x[],y[],xi,yi,x[i],y[i]))>eps) do
inc(i);
while (cj(x[],y[],xi,yi,x[j],y[j])>)and(abs(cj(x[],y[],xi,yi,x[j],y[j]))>eps) do
dec(j);
if i<=j then
begin
swap(x[i],x[j]);
swap(y[i],y[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end; procedure init;
var
i:longint;
minx,miny:extended;
begin
read(n);
minx:=;
miny:=;
for i:= to n do
begin
read(x[i],y[i]);
if (y[i]<miny)or((abs(y[i]-miny)<eps)and(x[i]<minx)) then
begin
minx:=x[i];
miny:=y[i];
end;
end;
i:=;
while i<=n do
if (abs(x[i]-minx)<eps)and(abs(y[i]-miny)<eps) then
begin
swap(x[i],x[n]);
swap(y[i],y[n]);
dec(n);
end
else inc(i);
x[]:=minx;
y[]:=miny;
sort(,n);
inc(n);
x[n]:=x[];
y[n]:=y[];
end; procedure work;
var
i:longint;
begin
for i:= to n do
begin
while (tot>)and(cj(x[s[tot-]],y[s[tot-]],x[s[tot]],y[s[tot]],x[i],y[i])<) do
dec(tot);
inc(tot);
s[tot]:=i;
if (abs(x[s[tot]]-x[s[tot-]])<eps)and(abs(y[s[tot]]-y[s[tot-]])<eps) then dec(tot);
end;
for i:= to tot do
begin
x[i]:=x[s[i]];
y[i]:=y[s[i]];
end;
n:=tot;
for i:= to n do
begin
if jl(-y[],x[],-y[],x[],x[i],y[i])<jl(-y[],x[],-y[],x[],x[p[,]],y[p[,]]) then p[,]:=i;
if jl(x[],y[],x[],y[],x[i],y[i])>jl(x[],y[],x[],y[],x[p[,]],y[p[,]]) then p[,]:=i;
if jl(-y[],x[],-y[],x[],x[i],y[i])>jl(-y[],x[],-y[],x[],x[p[,]],y[p[,]]) then p[,]:=i;
end;
for i:= to n- do
begin
p[i]:=p[i-];
p[i,]:=i;
while jl(-y[i],x[i],-y[i+],x[i+],x[(p[i,]+)mod n],y[(p[i,]+)mod n])<jl(-y[i],x[i],-y[i+],x[i+],x[p[i,]],y[p[i,]]) do
p[i,]:=(p[i,]+)mod n;
while jl(x[i],y[i],x[i+],y[i+],x[(p[i,]+)mod n],y[(p[i,]+)mod n])>jl(x[i],y[i],x[i+],y[i+],x[p[i,]],y[p[i,]]) do
p[i,]:=(p[i,]+)mod n;
while jl(-y[i],x[i],-y[i+],x[i+],x[(p[i,]+)mod n],y[(p[i,]+)mod n])>jl(-y[i],x[i],-y[i+],x[i+],x[p[i,]],y[p[i,]]) do
p[i,]:=(p[i,]+)mod n;
end;
sp:=;
for i:= to n- do
sp:=min(sp,abs((jl(x[i],y[i],x[i+],y[i+],x[p[i,]],y[p[i,]])-jl(x[i],y[i],x[i+],y[i+],x[p[i,]],y[p[i,]]))*(jl(-y[i],x[i],-y[i+],x[i+],x[p[i,]],y[p[i,]])-jl(-y[i],x[i],-y[i+],x[i+],x[p[i,]],y[p[i,]]))));
writeln(sp::);
for i:= to n- do
if abs(abs((jl(x[i],y[i],x[i+],y[i+],x[p[i,]],y[p[i,]])-jl(x[i],y[i],x[i+],y[i+],x[p[i,]],y[p[i,]]))*(jl(-y[i],x[i],-y[i+],x[i+],x[p[i,]],y[p[i,]])-jl(-y[i],x[i],-y[i+],x[i+],x[p[i,]],y[p[i,]])))-sp)<eps then break;
jiao(x[n+],y[n+],x[i],y[i],x[i+]-x[i],y[i+]-y[i],x[p[i,]],y[p[i,]]);
jiao(x[n+],y[n+],x[p[i,]],y[p[i,]],y[i]-y[i+],x[i+]-x[i],x[p[i,]],y[p[i,]]);
jiao(x[n+],y[n+],x[p[i,]],y[p[i,]],x[i+]-x[i],y[i+]-y[i],x[p[i,]],y[p[i,]]);
jiao(x[n+],y[n+],x[p[i,]],y[p[i,]],y[i]-y[i+],x[i+]-x[i],x[i],y[i]);
x[]:=;
y[]:=;
for i:= to do
if (y[n+i]<y[])or((abs(y[]-y[n+i])<eps)and(x[n+i]<x[])) then
begin
x[]:=x[n+i];
y[]:=y[n+i];
end;
for i:= to do
if (abs(x[]-x[n+i])<eps)and(abs(y[]-y[n+i])<eps) then break;
swap(x[n+],x[n+i]);
swap(y[n+],y[n+i]);
writeln(x[]+eps::,' ',y[]+eps::);
sort(n+,n+);
for i:= to do
writeln(x[n+i]+eps::,' ',y[n+i]+eps::);
end; begin
init;
work;
end.
1185: [HNOI2007]最小矩形覆盖 - BZOJ的更多相关文章
- 洛谷 P3187 BZOJ 1185 [HNOI2007]最小矩形覆盖 (旋转卡壳)
题目链接: 洛谷 P3187 [HNOI2007]最小矩形覆盖 BZOJ 1185: [HNOI2007]最小矩形覆盖 Description 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形, ...
- BZOJ:1185: [HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 这计算几何……果然很烦…… 发现自己不会旋转卡壳,补了下,然后发现求凸包也不会…… 凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用 ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1435 Solve ...
- 1185: [HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1426 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 ...
随机推荐
- Redis - 环境的安装配置
Redis 下载安装步骤: 下载 redis 源码: [huey@huey-K42JE ~]$ wget http://download.redis.io/releases/redis-x.y.z.t ...
- java源码研究--List中的set和add方法区别
在处理一道题目是,发现他们使用了List 中的set 方法,这个方法我平时很少用到,今天来研究一下,set和add的区别 add(int index,Object obj)方法与set(int ind ...
- hdoj1423 最长上升公共子序列
hdoj1423 题目分析: 两个数组a[n1] , b[n2], 求最长上升公共子序列. 我们可用一维存储 f[i] 表示 b 数组以 j 结尾, 与 a[] 数组构成的最长公共上升子序列. 对数组 ...
- Android从imageview中获得bitmap
第一种: 使用setDrawingCacheEnabled()和getDrawingCache()这两种方法,第一个是为了设置是否开启缓存,第二个就可以直接获得imageview中的缓存,一般来说需要 ...
- 浏览器userAgent大全
iPhone ●iOSMozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Versi ...
- Objective-C 【动态类型检测&响应方法】
------------------------------------------- 动态类型检测 代码: #import <Foundation/Foundation.h> @inte ...
- linux电源管理系列(一)
本系列将逐步介绍linux电源管理相关的知识,涉及到常见电源管理机制.linux电源管理机制.linux驱动中有关电源管理的相关接口.内核文档中关于Linux电源管理架构文档的分析.以下将以此来介绍相 ...
- 模板:strncpy函数
参考链接:http://baike.baidu.com/view/1207711.htm strncpy 是 C语言的函数之一,来自 C语言标准库,定义于 string.h,char *strncpy ...
- DigitalOcean(DO)购买VPS流程
背景: 对于一个程序员来说,拥有自己的一台国外服务器是一种多么激动的事情,尽管配置不如自己电脑的1/5,但是想一想可以不用备案搭建网站,可以搭建shadow服务器,从此通过自己的服务器上网,想一想真是 ...
- 【ZeroMQ】消息模式
1.请求/应答模式(REP/REQ) 该模式特征: 服务器使用REP类型套接字而客户端使用REQ类型套接字 客户端发送请求和接收答复,而服务器则接收请求并发送答复 客户端可以连接到一个或多个服务器.在 ...