bzoj 1185 [HNOI2007]最小矩形覆盖——旋转卡壳
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1185
矩形一定贴着凸包的一条边。不过只是感觉这样。
枚举一条边,对面的点就是正常的旋转卡壳。两边的那个点可以用点积的最小/大来判断,因为是投影。
然后调了一万年。不过好像把精度设成 1e-13 而不是 1e-8 就能过了。
和许多代码对拍,有各种各样的不同。也不知道自己是不是真的对了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
using namespace std;
const int N=5e4+;const db eps=1e-,INF=1e18;
int n,tot; db ans;
struct Node{
db x,y;
Node(db a=,db b=):x(a),y(b) {}
bool operator< (const Node &b)const {return x<b.x||(x==b.x&&y<b.y);}
Node operator- (const Node &b)const {return Node(x-b.x,y-b.y);}
Node operator+ (const Node &b)const {return Node(x+b.x,y+b.y);}
db operator* (const Node &b)const {return x*b.x+y*b.y;}
Node operator* (const db &b)const {return Node(x*b,y*b);}
Node operator/ (const db &b)const {return Node(x/b,y/b);}
}t[N],a[N],prn[];
db Mx(db a,db b){return a>b?a:b;}
int dcmp(db x){if(x>eps)return ;if(x<-eps)return -;return ;}
db cross(Node u,Node v){return u.x*v.y-u.y*v.x;}
void upd(int &x){x>n?x-=n:;}
db Sqr(db x){return x*x;}
db dist(Node u,Node v){return sqrt(Sqr(u.x-v.x)+Sqr(u.y-v.y));}
int main()
{
scanf("%d",&tot);
for(int i=;i<=tot;i++)scanf("%lf%lf",&t[i].x,&t[i].y);
sort(t+,t+tot+);
for(int i=;i<=tot;i++)
{while(n>&&dcmp(cross(a[n]-t[i],a[n-]-t[i]))>=)n--;a[++n]=t[i];}
for(int i=tot-,lm=n;i;i--)
{while(n>lm&&dcmp(cross(a[n]-t[i],a[n-]-t[i]))>=)n--;a[++n]=t[i];}
a[n]=a[]; n--; ans=INF;
int p0=,cr=,p1=;//out of for()
for(int i=;i<=n;i++)
{
Node d=a[i+]-a[i];
while(dcmp(cross(d,a[cr+]-a[i])-cross(d,a[cr]-a[i]))>)cr++,upd(cr);
while(dcmp((a[p0+]-a[i])*d-(a[p0]-a[i])*d)>=)p0++,upd(p0);//>=?
if(i==)p1=cr;//
while(dcmp((a[p1+]-a[i])*d-(a[p1]-a[i])*d)<=)p1++,upd(p1); db len=dist(a[i+],a[i]);
db s1=(a[p0]-a[i])*d/len, s2=(a[p1]-a[i])*d/len;
db hi=cross(d,a[cr]-a[i])/len, ara=(s1-s2)*hi;//not /(2*len)
if(dcmp(ara-ans)>=)continue; ans=ara;
// if(ara>=ans)continue; ans=ara;
Node x1=d/len*(s1-s2);
Node x2=d/len*hi; swap(x2.x,x2.y); x2.x=-x2.x;//*i
prn[]=a[i]+d/len*s2; prn[]=prn[]+x1;
prn[]=prn[]+x2; prn[]=prn[]+x2;
}
printf("%.5f\n",ans);int id=;
for(int i=;i<=;i++)
{
Node u=prn[i],v=prn[id];
if(dcmp(u.y-v.y)<||(!dcmp(u.y-v.y)&&dcmp(u.x-v.x)<))id=i;
}
for(int j=;j<=;j++,id++,id>?id=:)
{
if(!dcmp(prn[id].x))prn[id].x=;
if(!dcmp(prn[id].y))prn[id].y=;//avoid -0
printf("%.5f %.5f\n",prn[id].x,prn[id].y);
}
return ;
}
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又崩了,直接贴一下人家的代码. 代码: #include"stdio.h" #include"str ...
- BZOJ:1185: [HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 这计算几何……果然很烦…… 发现自己不会旋转卡壳,补了下,然后发现求凸包也不会…… 凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用 ...
- bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包
[HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 2081 Solved: 920 ...
- bzoj 1185 [HNOI2007]最小矩形覆盖 凸包+旋转卡壳
题目大意 用最小矩形覆盖平面上所有的点 分析 有一结论:最小矩形中有一条边在凸包的边上,不然可以旋转一个角度让面积变小 简略证明 我们逆时针枚举一条边 用旋转卡壳维护此时最左,最右,最上的点 注意 注 ...
- BZOJ 1185 [HNOI2007]最小矩形覆盖:凸包 + 旋转卡壳
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1185 题意: 给出二维平面上的n个点,问你将所有点覆盖的最小矩形面积. 题解: 先找出凸 ...
- ●BZOJ 1185 [HNOI2007]最小矩形覆盖
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解: 计算几何,凸包,旋转卡壳 结论:矩形的某一条边在凸包的一条边所在的直线上. ( ...
- 【bzoj1185】[HNOI2007]最小矩形覆盖 (旋转卡壳)
给你一些点,让你用最小的矩形覆盖这些点 首先有一个结论,矩形的一条边一定在凸包上!!! 枚举凸包上的边 用旋转卡壳在凸包上找矩形另外三点... 注意精度问题 #include<cstdio> ...
随机推荐
- python - pandas或者sklearn中如何将字符形式的标签数字化
参考:http://www.php.cn/wenda/91257.html https://www.cnblogs.com/king-lps/p/7846414.html http://blog.cs ...
- 十六 web爬虫讲解2—PhantomJS虚拟浏览器+selenium模块操作PhantomJS
PhantomJS虚拟浏览器 phantomjs 是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器,利用这个软件,可以获取到网址js加载的任何信息,也就是可以获取浏览器异步加载的 ...
- IOS-github优秀开源项目大全
github优秀开源项目大全-iOS 前言 本文旨在搜集github上优秀的开源项目 本文搜集的项目都是用于iOS开发 本文会持续更新… 完整客户端 ioctocat github的iOS客户端,目前 ...
- Repeat a string repeat a string
重要的事情说3遍! 重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串. 这是一些对你有帮助的资源: Global String Object 这道题的思路就是按照题目要求一步一步 ...
- yyyy-MM-dd EEE hh:mm:ss(日期转换)
<script> /** * 对Date的扩展,将 Date 转化为指定格式的String * 月(M).日(d).12小时(h).24小时(H).分(m).秒(s).周(E).季度(q) ...
- [SQL]会引起全表扫描的10种SQL语句
1.模糊查询效率很低: 原因:like本身效率就比较低,应该尽量避免查询条件使用like:对于like ‘%...%’(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低:另外,由于匹配算法的 ...
- C++ 进阶5 拷贝构造 深度复制 运算符重载
C++ 进阶5 拷贝构造 深度复制 运算符重载 20131026 例子: 运行环境是G++ 编译, /* * main.cpp * * Created on: 2013年10月26日 * ...
- js Worker 线程
在平时的运行的javascript脚本都在主线程中执行,如果当前脚本包含复杂的.耗时的代码.那么JavaScript脚本的执行将会被阻塞,甚至整个刘看齐都是提示失去响应. 例子: 假设程序需要计算.收 ...
- 剑指offer--47.数据流中的中位数
时间限制:1秒 空间限制:32768K 热度指数:122511 算法知识视频讲解 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如 ...
- SQL SERVER - set statistics time on的理解
一.set statistics time on的作用 显示分析.编译和执行各语句所需的毫秒数. 二.语法 SET STATISTICS TIME { ON | OFF } 注释 1.当 SET ST ...