1185: [HNOI2007]最小矩形覆盖

Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge
Submit: 1426  Solved: 648
[Submit][Status][Discuss]

Description

Input

 

Output

 

Sample Input

 

Sample Output

 

HINT

 

Source

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e5+;
const double eps=1e-;
double ans=1e60;
struct Vector{
double x,y;
Vector(double x=,double y=):x(x),y(y){}
}p[N],q[N],t[];int n,top;
Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
Vector operator - (Vector A,Vector B){return Vector(A.x-B.x,A.y-B.y);}
Vector operator * (Vector A,double p){return Vector(A.x*p,A.y*p);}
Vector operator / (Vector A,double p){return Vector(A.x/p,A.y/p);}
double operator * (Vector A,Vector B){return A.x*B.y-A.y*B.x;;}
double operator / (Vector A,Vector B){return A.x*B.x+A.y*B.y;;}
bool operator<(Vector a,Vector b){
return fabs(a.y-b.y)<eps?a.x<b.x:a.y<b.y;
}
bool operator==(Vector a,Vector b){
return fabs(a.x-b.x)<eps&&fabs(a.y-b.y)<eps;
}
double Dot(Vector A,Vector B){return A.x*B.x+A.y*B.y;}
double Length(Vector A){return sqrt(Dot(A,A));}
double Angle(Vector A,Vector B){return acos(Dot(A,B)/(Length(A)*Length(B)));}
double Cross(Vector A,Vector B){return A.x*B.y-A.y*B.x;}
double Area2(Vector A,Vector B,Vector C){return Cross(B-A,C-A);}
bool cmp(Vector a,Vector b){
double t=(a-p[])*(b-p[]);
if(fabs(t)<eps) return Length(p[]-a)-Length(p[]-b)<;
else return t>;
}
void graham(){//凸包
for(int i=;i<=n;i++) if(p[i]<p[]) swap(p[i],p[]);
sort(p+,p+n+,cmp);
q[++top]=p[];
for(int i=;i<=n;i++){
while(top>&&(q[top]-q[top-])*(p[i]-q[top])<eps) top--;
q[++top]=p[i];
}
q[]=q[top];
}
void RC(){//旋转卡壳
int l=,r=,p=;
double L,R,D,H;
for(int i=;i<top;i++){
D=Length(q[i]-q[i+]);
while((q[i+]-q[i])*(q[p+]-q[i])-(q[i+]-q[i])*(q[p]-q[i])>-eps) p=(p+)%top;
while((q[i+]-q[i])/(q[r+]-q[i])-(q[i+]-q[i])/(q[r]-q[i])>-eps) r=(r+)%top;
if(i==) l=r;
while((q[i+]-q[i])/(q[l+]-q[i])-(q[i+]-q[i])/(q[l]-q[i])<eps) l=(l+)%top;
L=(q[i+]-q[i])/(q[l]-q[i])/D,R=(q[i+]-q[i])/(q[r]-q[i])/D;
H=(q[i+]-q[i])*(q[p]-q[i])/D;
if(H<) H=-H;
double tmp=(R-L)*H;
if(tmp<ans){
ans=tmp;
t[]=q[i]+(q[i+]-q[i])*(R/D);
t[]=t[]+(q[r]-t[])*(H/Length(t[]-q[r]));
t[]=t[]-(t[]-q[i])*((R-L)/Length(q[i]-t[]));
t[]=t[]-(t[]-t[]);
}
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
graham();
RC();
printf("%.5lf\n",ans);
int fir=;
for(int i=;i<;i++) if(t[i]<t[fir]) fir=i;
for(int i=;i<;i++){//某些OJ评测卡精度.. 比如,洛谷
if(fabs(t[(i+fir)%].x)<1e-) printf("0.00000 ");else printf("%.5lf ",t[(i+fir)%].x);
if(fabs(t[(i+fir)%].y)<1e-) printf("0.00000\n");else printf("%.5lf\n",t[(i+fir)%].y);
}
return ;
}
/*
Sample Input
6
1.0 3.00000
1 4.00000
2.00000 1
3 0.00000
3.00000 6
6.0 3.0 Sample Output
18.00000
3.00000 0.00000
6.00000 3.00000
3.00000 6.00000
0.00000 3.00000
*/

1185: [HNOI2007]最小矩形覆盖的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      就是一道凸包(枚举凸包的边作为矩形的一条边)的裸题,只是不太好打,所以犹豫到今天才打 不说了,说起AC都是泪啊,因为没有精度判断,没有判重(算距离时除0了)错了好久 拍了好久都和标称是一样的,因为 ...

随机推荐

  1. 【HDOJ6229】Wandering Robots(马尔科夫链,set)

    题意:给定一个n*n的地图,上面有k个障碍点不能走,有一个机器人从(0,0)出发,每次等概率的不动或者往上下左右没有障碍的地方走动,问走无限步后停在图的右下部的概率 n<=1e4,k<=1 ...

  2. Object转json-常见问题总结

    Object转json-常见问题总结 1.Object中有Timestamp.Date等日期类型数据 http://blog.csdn.net/without0815/article/details/ ...

  3. Metasploit笔记之信息收集命令

    书籍参考:Metasploit渗透指南 Nmap:使用没有时 ubuntu自动提示安装命令 用法: nmap -sS -Pn  192.168.1.0 -sS:执行一次隐秘的tcp扫描 -Pn:不使用 ...

  4. 容器中元素的去重——ans.erase(unique(ans.begin(),ans.end()),ans.end());

    啊,原来unique()函数,只是处理的连续的元素,比如 -1 -1 -1 1 2 -1 2 就处理成了 -1 1 2 -1 2 -1 -1并且返回5,之后eraser(5,7)剩下了 -1 1 2 ...

  5. [Inside HotSpot] Java分代堆

    [Inside HotSpot] Java分代堆 1. 宇宙初始化 JVM在启动的时候会初始化各种结构,比如模板解释器,类加载器,当然也包括这篇文章的主题,Java堆.在hotspot源码结构中gc/ ...

  6. linux grep 查找文件内容

    自试: wang@wang:~$ grep -i "*args*" ~/IGV01-SW/src/bzrobot_diagnostics/bzrobot_lightbelt_man ...

  7. guake使用

    1. 安装:sudo apt-get install guake 2. 在终端输入guake 3. f12:显示/隐藏 4. f11:全屏/正常屏切换 5. f2:重命名终端名 6. 还可以查看修改快 ...

  8. 华硕win7安装ubuntu14.04.02注意事项

    一.win7下划出给ubuntu系统的分区 1.win7自带分磁盘的工具,只需要压缩步骤即可,不需要继续分盘符格式化等操作 win7下为绿色 安装时为free space 二.制作启动盘并安装注意事项 ...

  9. ADO如何记录SQL日志

    ADO如何记录SQL日志 procedure TfrmDM.ADOConnection1WillExecute(Connection: TADOConnection; var CommandText: ...

  10. android状态栏总结

    针对状态栏的操作,只针对4.4kitKat(含)以上的机型,部分国产rom会失效,目前发现的有华为的EMUI Activity必须是noActionbar主题 本文基于StatusBarUtils略作 ...