P3187 [HNOI2007]最小矩形覆盖
首先这个矩形的一条边肯定在凸包上。那么可以求出凸包然后枚举边,用类似旋转卡壳的方法求出另外三条边的位置,也就是求出以它为底最上面最右边最左边的点的位置。离它最远的点可以用叉积求,最左最右的可以用点积求。顺便注意精度问题,因为很小的时候可能会输出-0.00000,所以特判一下,当坐标小于eps的时候强制它等于0就行了
//minamoto
#include<bits/stdc++.h>
#define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
#define ab(a) (a<0?a=-a:0)
using namespace std;
const int N=1e5+5;const double eps=1e-8;
struct node{double x,y;}p[N],st[N],q[5];int top,n;
inline node operator -(node a,node b){return node{a.x-b.x,a.y-b.y};}
inline node operator +(node a,node b){return node{a.x+b.x,a.y+b.y};}
inline node operator *(node a,double b){return node{a.x*b,a.y*b};}
inline double operator *(node a,node b){return a.x*b.y-b.x*a.y;}
inline double dot(node a,node b){return a.x*b.x+a.y*b.y;}
inline double area(node a,node b,node c){return fabs((b-a)*(c-a));}
inline double len(node a){return sqrt(a.x*a.x+a.y*a.y);}
inline bool operator <(node a,node b){
a=a-p[1],b=b-p[1];
return a*b==0?len(a)<len(b):a*b>0;
}
void graham(){
int k=1;
fp(i,1,n){
scanf("%lf%lf",&p[i].x,&p[i].y);
if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))k=i;
}swap(p[1],p[k]),sort(p+2,p+n+1);
st[0]=p[1],st[1]=p[2],top=1;
fp(i,3,n){
while(top&&(p[i]-st[top-1])*(st[top]-st[top-1])>=0)--top;
st[++top]=p[i];
}st[++top]=p[1];
// fp(i,0,top)printf("%.2lf %.2lf\n",st[i].x,st[i].y);
}
void get(){
double ans=1e100;int a=1,b=1,c=1;
fp(i,1,top-2){
while((st[a+1]-st[i])*(st[i-1]-st[i])>=(st[a]-st[i])*(st[i-1]-st[i]))a=(a+1)%top;
while(dot(st[b+1]-st[i],st[i-1]-st[i])<=dot(st[b]-st[i],st[i-1]-st[i]))b=(b+1)%top;
if(i==1)c=a;
while(dot(st[c+1]-st[i-1],st[i]-st[i-1])<=dot(st[c]-st[i-1],st[i]-st[i-1]))c=(c+1)%top;
double dis=len(st[i]-st[i-1]);
double L=dot(st[c]-st[i],st[i-1]-st[i])/dis;ab(L);
double R=dot(st[b]-st[i-1],st[i]-st[i-1])/dis;ab(R);
double H=area(st[i],st[i-1],st[a])/dis;ab(H);
double tmp=(L+R-dis)*H;
if(tmp<ans){
ans=tmp;
q[0]=st[i]-(st[i]-st[i-1])*(L/dis);
q[1]=q[0]+(st[i]-st[i-1])*((L+R-dis)/dis);
q[2]=q[1]+(st[b]-q[1])*(H/len(st[b]-q[1]));
q[3]=q[2]+(st[i-1]-st[i])*((L+R-dis)/dis);
}
}printf("%.5lf\n",ans);
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d",&n);graham();get();
int s=0;
fp(i,0,3)if(q[i].y<q[s].y||(q[i].y==q[s].y&&q[i].x<q[s].x))s=i;
if(fabs(q[s].x)<=eps)q[s].x=0;if(fabs(q[s].y)<=eps)q[s].y=0;
printf("%.5lf %.5lf\n",q[s].x,q[s].y);
fp(i,1,3){
s=(s+1)%4;
if(fabs(q[s].x)<=eps)q[s].x=0;if(fabs(q[s].y)<=eps)q[s].y=0;
printf("%.5lf %.5lf\n",q[s].x,q[s].y);
}return 0;
}
P3187 [HNOI2007]最小矩形覆盖的更多相关文章
- 洛谷 P3187 BZOJ 1185 [HNOI2007]最小矩形覆盖 (旋转卡壳)
题目链接: 洛谷 P3187 [HNOI2007]最小矩形覆盖 BZOJ 1185: [HNOI2007]最小矩形覆盖 Description 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形, ...
- 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1945 Solve ...
- BZOJ:1185: [HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 这计算几何……果然很烦…… 发现自己不会旋转卡壳,补了下,然后发现求凸包也不会…… 凸包:找一个最左下的点,其他点按照与它连边的夹角排序,然后维护一个栈用 ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1435 Solve ...
- 【BZOJ1185】[HNOI2007]最小矩形覆盖(凸包,旋转卡壳)
[BZOJ1185][HNOI2007]最小矩形覆盖(凸包,旋转卡壳) 题面 BZOJ 洛谷 题解 最小的矩形一定存在一条边在凸包上,那么枚举这条边,我们还差三个点,即距离当前边的最远点,以及做这条边 ...
- bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包
[HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 2081 Solved: 920 ...
- 1185: [HNOI2007]最小矩形覆盖
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1426 Solve ...
- BZOJ1185[HNOI2007] 最小矩形覆盖(旋转卡壳)
BZOJ1185[HNOI2007] 最小矩形覆盖 题面 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点的坐标 分析 首先可以先求凸包,因为覆盖了凸包上的顶点,凸 ...
- LG3187 [HNOI2007]最小矩形覆盖
题意 题目描述 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点坐标 输入输出格式 输入格式: 第一行为一个整数n(3<=n<=50000),从第2至第 ...
随机推荐
- Python函数: any()和all()的用法
版权声明:本文为博主原创文章,未经允许不得转载 引子 平常的文本处理工作中,我经常会遇到这么一种情况:用python判断一个string是否包含一个list里的元素. 这时候使用python的内置函数 ...
- python输出带颜色字体详解
在python开发的过程中,经常会遇到需要打印各种信息.海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性.这时候,如果能给重要的信息加上字体颜色,那么就会更加方便用户阅读了. ...
- airfoil polar data during post stall stages (high AOA)
airfoil polar data during post stall stages (high AOA) Table of Contents 1. airfoil polar during pos ...
- 【ZJOI2017 Round2练习】
………………………………………………………………………… DAY1:听说是湖南的题 T1:spaly?毫无想法,写个暴力压压惊 T2:尼克杨问号脸 T3:FFT我不会啊,70points已经尽力了
- M - 小希的迷宫 并查集
上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...
- ngTbale真分页实现排序、搜索等功能
一. 真分页表格基础 1. 需求:分页,排序,搜索都是需要发API到服务端. 2. JS实现代码: getStorage是localStorage一个工具方法,可以自己写这个方法. API参数如下: ...
- NETCore项目报错 An error occurred while starting the application
在发布到IIS的webApi项目中,运行时报出以上错误, 解决方法: 1.打开发布目录文件夹,找到web.config文件 2.打开web.config找到stdoutLogEnabled=" ...
- hdu 1247 Hat’s Words(从给的单词中找hat's word 并按字典序输出)
1.在使用mp[key]的时候它会去找键值为key的项,假设没有,他会自己主动加入一个key的项,再把value赋值为对应的初始值(value是int的话赋值为0,string的话赋值为空).所以假设 ...
- [JavaEE] Data Validation
When we create Entity and Respority, we also need to do validations to protect our data. In Java, va ...
- HDU 3008 DP
基础DP题 打BOSS BOSS和自己都有100点血.玩家先手 每回合能够选择施放技能攻击(耗蓝,共n种)或者普通攻击(不耗蓝,伤害为1),BOSS每回合会攻击自己q点血,每回合自己会恢复t点法力 ...