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

不说了,说起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. ASP常用函数表

    ASP常用函数表(新手们的好工具) 作者:未知 Array() 函数返回一个数组 表达式 Array(list) 允许数据类型: 字符,数字均可 实例: <% Dim myArray() For ...

  2. HDOJ2018母牛的故事

    母牛的故事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. HDOJ2005第几天

    第几天? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. uml与数据库设计

    一.类之间的关系如下图所示: 二.UML与数据库设计主要讨论的内容: 三.依赖关系强调的是类操作间的使用关系,类图到表结构的映射中并不涉及这种关系,所以只需讨论泛化关系.关联关系到表的映身规范. 1. ...

  5. dreamweaver中用正则表达式查找替换批量删除 tppabs标签的方法

    查找替换 正则表达式  \btppabs="h[^"]*" 后面不能有空格 你懂得的 选中右下角的 √[使用正则表达式] 替换全部

  6. 设置win7任务栏显示标题,而不显示缩略图

    win7系统的任务栏可以显示桌面缩略图,这是非常好的一个功能,但是有时候我们希望只显示标题,如下所示 怎样设置呢?只要在桌面上的计算机图标上面“右键”,选择“属性”,在弹出的窗口选择“高级系统设置”, ...

  7. TFS2012常见问题及解答

    1.删除workItem工作项(包括Bug,用户场景,任务等) 需要利用到witadmin工具,目录在cd %programfiles%\Microsoft Visual Studio 11.0\Co ...

  8. 资源汇集:nginx教程从入门到精通

    http://linux.cn/article-4279-1.html

  9. Cocos中的观察者设计模式与通知机制

    观察者(Observer)模式也叫发布/订阅(Publish/Subscribe)模式,是 MVC( 模型-视图-控制器)模式的重要组成部分.天气一直是英国人喜欢讨论的话题,而最近几年天气的变化也成为 ...

  10. Bootstrap两端对齐的导航实例

    Bootstrap两端对齐的导航,样式剥离出来代码如下: <!DOCTYPE html> <html> <head> <title>Bootstrap ...