就是一道凸包(枚举凸包的边作为矩形的一条边)的裸题,只是不太好打,所以犹豫到今天才打

不说了,说起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的更多相关文章

  1. 洛谷 P3187 BZOJ 1185 [HNOI2007]最小矩形覆盖 (旋转卡壳)

    题目链接: 洛谷 P3187 [HNOI2007]最小矩形覆盖 BZOJ 1185: [HNOI2007]最小矩形覆盖 Description 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形, ...

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

    1185: [HNOI2007]最小矩形覆盖 这计算几何……果然很烦…… 发现自己不会旋转卡壳,补了下,然后发现求凸包也不会…… 凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用 ...

  3. BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1435  Solve ...

  4. 1185: [HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1426  Solve ...

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

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

  6. ●BZOJ 1185 [HNOI2007]最小矩形覆盖

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解: 计算几何,凸包,旋转卡壳 结论:矩形的某一条边在凸包的一条边所在的直线上. ( ...

  7. BZOJ 1185 [HNOI2007]最小矩形覆盖:凸包 + 旋转卡壳

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 题意: 给出二维平面上的n个点,问你将所有点覆盖的最小矩形面积. 题解: 先找出凸 ...

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

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

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

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

随机推荐

  1. SAX - Hello World

    SAX 是一种事件驱动的 XML 数据处理模型.对于 DOM 模型,解析 XML 文档时,需要将所有内容载入内容.相比 DOM 模型,SAX 模型更为高效,它一边扫描一边解析 XML 文档.但与 DO ...

  2. Linux 命令 - ftp: 网络文件传输工具

    命令格式 ftp [-pinegvd] [host] 命令参数 -A 传输文件模式为主动模式. -p 传输文件模式为被动模式. -i 关闭交互模式. -n 关闭自动登录功能. -e 不记录历史命令. ...

  3. java开发:分享一下使用urlrewrite实现网址的个性访问

    很多网站都有一些比较个性的域名访问方式,如:http://www.xxx.com/u/pp  点开就可以看到pp的个人主页了,这种地址比较容易让人记住,那今天就来讲讲这种技术的实现方式. 1.使用ja ...

  4. NGUI的原理机制:深入剖析UIPanel,UIWidget,UIDrawCall底层原理

    这是我去搜狐畅游面试时,面试官问的一个问题.问NGUI的机制原理是什么?就是这个插件是根据什么写出来的.当时没答上来,下面是我从转载过来的,可以研究研究. 之前项目中用的NGUI的版本是3.0.7 f ...

  5. Linux C编程--fork()详解

    以下给出说明: fork函数 #include <sys/types.h>  #include <unistd.h> pid_t fork(void); fork调用失败则返回 ...

  6. VSFTPD无法上传的解决方法

    搭建好FTP之后就没有去测试了,今天去试了一下上传的时候发生错误了,无法上传,提示“553 Could not create file”错误, 上网找了一些资料,发现很多都说是权限和防火墙的问题,但是 ...

  7. Android之按钮

     Button 表示一个按钮.用户点击后会作出响应.具体的响应行为需要我们来定义(一 般通过监听器来处理).  Button 是 TextView 的子类,因此,原则上,TextView 的属性设置均 ...

  8. Linux命令(6):mv命令

    1.作用: 为文件或目录改名或将文件由一个目录移入另一个目录中 2.格式: mv  [选项] 源文件或目录 目标文件或目录 3.常见参数: 4.使用实例: [root@localhost ~]# mv ...

  9. Xcode7主题路径

    // Xcode7主题路径~/Library/Developer/Xcode/UserData/FontAndColorThemes

  10. java SimpleDateFormat非线程安全测试

    public class MyThread extends Thread { private SimpleDateFormat sdf; private String dateString; publ ...