bzoj1185
一遇到数学题和计算几何题我就要调半天……
玛雅,我真是太弱了……
基本思路很简单,先上凸包,然后矩形与凸包一边重合,然后旋转卡壳即可
然而我没怎么写过计算几何题,一开始写的各种囧,后来看了hzwer的写法才写得正常一些
一开始写囧,是找矩形的左右边界,用勾股定理算的,囧得不行;
后来发现可以用点积来判断,点积的几何意义:向量A在向量B上投影的长度*向量B的长度
然后就很好做了
const eps=1e-8;
type point=record
x,y:double;
end; var a:array[..] of point;
q:array[..] of longint;
p:array[..] of point;
n,f1,f2,h,r,t,k,i:longint;
tmp,ans,d,l,l1,l2:double; procedure swap(var a,b:point);
var c:point;
begin
c:=a;
a:=b;
b:=c;
end; function cmp(a,b:point):boolean;
begin
if abs(a.y-b.y)<eps then exit(a.x<b.x);
exit(a.y<b.y);
end; function cross(i,j,k,p:longint):double;
begin
exit((a[i].x-a[j].x)*(a[k].y-a[p].y)-(a[i].y-a[j].y)*(a[k].x-a[p].x));
end; procedure sort(l,r:longint);
var i,j:longint;
x:point;
begin
i:=l;
j:=r;
x:=a[(l+r) shr ];
repeat
while cmp(a[i],x) do inc(i);
while cmp(x,a[j]) do dec(j);
if not(i>j) then
begin
swap(a[i],a[j]);
inc(i);
dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end; function dis(a,b:point):double;
begin
exit(sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)));
end; function mul(i,j,p,q:longint):double;
begin
exit((a[i].x-a[j].x)*(a[p].x-a[q].x)+(a[i].y-a[j].y)*(a[p].y-a[q].y));
end; begin
readln(n);
for i:= to n do
readln(a[i].x,a[i].y);
sort(,n);
ans:=1e15;
t:=;
q[]:=;
for i:= to n do
begin
while (t>) and (cross(q[t],q[t-],i,q[t-])<eps) do dec(t);
inc(t);
q[t]:=i;
end;
k:=t;
for i:=n- downto do
begin
while (t>k) and (cross(q[t],q[t-],i,q[t-])<eps) do dec(t);
inc(t);
q[t]:=i;
end;
// q[t+]:=q[];
{ for i:=1 to t do
writeln(a[q[i]].x,' ',a[q[i]].y);
writeln(k); }
k:=;
h:=;
r:=;
for i:= to t- do
begin
d:=dis(a[q[i]],a[q[i+]]);
while cross(q[i+],q[i],q[k mod t+],q[i])-cross(q[i+],q[i],q[k],q[i])>-eps do k:=k mod t+;
while (mul(q[i+],q[i],q[r mod t+],q[i])-mul(q[i+],q[i],q[r],q[i])>-eps) do r:=r mod t+;
if i= then h:=r;
while (mul(q[i+],q[i],q[h mod t+],q[i])-mul(q[i+],q[i],q[h],q[i])<eps) do h:=h mod t+;
l1:=mul(q[i+],q[i],q[h],q[i])/d;
l2:=mul(q[i+],q[i],q[r],q[i])/d;
l:=abs(cross(q[i+],q[i],q[k],q[i]))/d;
tmp:=(l2-l1)*l;
if ans>tmp then
begin
ans:=tmp;
// writeln(tmp,' ',a[q[i]].x,' ',a[q[i]].y,' ',l2/d);
p[].x:=a[q[i]].x+(a[q[i+]].x-a[q[i]].x)*l2/d;
p[].y:=a[q[i]].y+(a[q[i+]].y-a[q[i]].y)*l2/d;
// writeln(p[].x,' ',p[].y);
p[].x:=p[].x+(a[q[r]].x-p[].x)*l/dis(p[],a[q[r]]);
p[].y:=p[].y+(a[q[r]].y-p[].y)*l/dis(p[],a[q[r]]);
p[].x:=p[].x-(p[].x-a[q[i]].x)*(l2-l1)/dis(p[],a[q[i]]);
p[].y:=p[].y-(p[].y-a[q[i]].y)*(l2-l1)/dis(p[],a[q[i]]);
p[].x:=p[].x-(p[].x-p[].x);
p[].y:=p[].y-(p[].y-p[].y);
end;
end;
writeln(ans::);
h:=;
for i:= to do
if cmp(p[i],p[h]) then h:=i;
for i:= to do
writeln(p[(h+i) mod ].x::,' ',p[(h+i) mod ].y::);
end.
bzoj1185的更多相关文章
- 【BZOJ1185】[HNOI2007]最小矩形覆盖(凸包,旋转卡壳)
[BZOJ1185][HNOI2007]最小矩形覆盖(凸包,旋转卡壳) 题面 BZOJ 洛谷 题解 最小的矩形一定存在一条边在凸包上,那么枚举这条边,我们还差三个点,即距离当前边的最远点,以及做这条边 ...
- BZOJ1185 [HNOI2007]最小矩形覆盖 【旋转卡壳】
题目链接 BZOJ1185 题解 最小矩形一定有一条边在凸包上,枚举这条边,然后旋转卡壳维护另外三个端点即可 计算几何细节极多 维护另外三个端点尽量不在这条边上,意味着左端点尽量靠后,右端点尽量靠前, ...
- BZOJ1185[HNOI2007] 最小矩形覆盖(旋转卡壳)
BZOJ1185[HNOI2007] 最小矩形覆盖 题面 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点的坐标 分析 首先可以先求凸包,因为覆盖了凸包上的顶点,凸 ...
- BZOJ1185 : [HNOI2007]最小矩形覆盖
求出凸包后,矩形的一条边一定与凸包的某条边重合. 枚举每条边,求出离它最远的点和离它最左最右的点,因为那三个点是单调变化的,所以复杂度为$O(n)$. 注意精度. #include<cstdio ...
- 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1945 Solve ...
- BZOJ1185 HNOI2007 最小矩形覆盖 凸包、旋转卡壳
传送门 首先,肯定只有凸包上的点会限制这个矩形,所以建立凸包. 然后可以知道,矩形上一定有一条边与凸包上的边重合,否则可以转一下使得它重合,答案会更小. 于是沿着凸包枚举这一条边,通过旋转卡壳找到离这 ...
- bzoj千题计划209:bzoj1185: [HNOI2007]最小矩形覆盖
http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解去看它 http://www.cnblogs.com/TheRoadToTheGold/p ...
- 2018.10.18 bzoj1185: [HNOI2007]最小矩形覆盖(旋转卡壳)
传送门 不难看出最后的矩形一定有一条边与凸包某条边重合. 因此先求出凸包,然后旋转卡壳求出当前最小矩形面积更新答案. 代码: #include<bits/stdc++.h> #define ...
- [BZOJ1185][HNOI2007]最小矩形覆盖-[凸包+旋转卡壳]
Description 传送门 Solution 感性理解一下,最小矩形一定是由一条边和凸包上的边重合的. 然后它就是模板题了..然而真的好难调,小于大于动不动就打错. Code #include&l ...
随机推荐
- 20145120黄玄曦 《java程序设计》 寒假学习总结
1和2.我对未来规划不多,我认为好好学习积累知识能帮助我应对未来的挑战,这是我的学习动力之一,此外,了解新知识满足好奇心也是我的主要的学习动力. 3.我认为专业课学习比公务员考试重要,我认为专业知识是 ...
- Sublime key bindings使用
开启vi mode后,可以使用很多的VI快捷方式,所以我的sublime已经不是单纯的st了,st的VI模式不完全支持所有的快捷键.我们来看一段官网的key bindings示例: { "k ...
- 腾讯QQ企业邮箱在ruby on rails 框架中的mailer配置
在编写ruby on rails程序时,我们可能会需要用到发送邮件的程序,如果使用gmail进行smtp发送一般问题不大,但很多企业使用的是腾讯QQ企业邮箱.使用该邮箱进行链接时出现各种错误,goog ...
- 使用zend studio配置Xdebug调试PHP教程
这里看过上面的文章后写一下自己的想法. 最近安装了zend studio 10.5,下载了破解文件.开始是下载了10.0的版本,但是注册码不正确.所以只能安装最新的10.5了. 接下来进行PHP代码调 ...
- Unity3D研究院之IOS本地消息通知LocalNotification的使用
原地址:http://www.xuanyusong.com/archives/2632 现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器 ...
- PHPer 为什么会被 Javaer 鄙视?
最近看了知乎上的一个话题 「在工作中,为什么 Java 程序员常常瞧不起 PHP 程序员?」 个人从业多年,用过的后端语言 ASP.ASP.NET.Java.PHP.Node.js.Python,如果 ...
- StringTokenizer用法
import java.util.StringTokenizer; public class StringTokenizerTest { public static void main(String[ ...
- POJ 1258 Agri-Net(最小生成树,基础)
题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<math ...
- jquery控制按钮的禁用与启用
jquery禁用a标签方法1: $(document).ready(function () { $("a").each(function () { var textValue = ...
- 无法将 grub-efl-amd64-signed 软件包安装/target/ 中
64位win7下U盘安装64位ubuntu12.04,出现[无法将 grub-efl-amd64-signed 软件包安装/target/ 中]的错误 1. 已经确认为 12.04.2 的 Bug B ...