传送门

首先这个矩形的一条边肯定在凸包上。那么可以求出凸包然后枚举边,用类似旋转卡壳的方法求出另外三条边的位置,也就是求出以它为底最上面最右边最左边的点的位置。离它最远的点可以用叉积求,最左最右的可以用点积求。顺便注意精度问题,因为很小的时候可能会输出-0.00000,所以特判一下,当坐标小于eps的时候强制它等于0就行了

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define fp(i,a,b) for(register int i=a,I=b+1;i<I;++i)
  4. #define fd(i,a,b) for(register int i=a,I=b-1;i>I;--i)
  5. #define ab(a) (a<0?a=-a:0)
  6. using namespace std;
  7. const int N=1e5+5;const double eps=1e-8;
  8. struct node{double x,y;}p[N],st[N],q[5];int top,n;
  9. inline node operator -(node a,node b){return node{a.x-b.x,a.y-b.y};}
  10. inline node operator +(node a,node b){return node{a.x+b.x,a.y+b.y};}
  11. inline node operator *(node a,double b){return node{a.x*b,a.y*b};}
  12. inline double operator *(node a,node b){return a.x*b.y-b.x*a.y;}
  13. inline double dot(node a,node b){return a.x*b.x+a.y*b.y;}
  14. inline double area(node a,node b,node c){return fabs((b-a)*(c-a));}
  15. inline double len(node a){return sqrt(a.x*a.x+a.y*a.y);}
  16. inline bool operator <(node a,node b){
  17. a=a-p[1],b=b-p[1];
  18. return a*b==0?len(a)<len(b):a*b>0;
  19. }
  20. void graham(){
  21. int k=1;
  22. fp(i,1,n){
  23. scanf("%lf%lf",&p[i].x,&p[i].y);
  24. if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))k=i;
  25. }swap(p[1],p[k]),sort(p+2,p+n+1);
  26. st[0]=p[1],st[1]=p[2],top=1;
  27. fp(i,3,n){
  28. while(top&&(p[i]-st[top-1])*(st[top]-st[top-1])>=0)--top;
  29. st[++top]=p[i];
  30. }st[++top]=p[1];
  31. // fp(i,0,top)printf("%.2lf %.2lf\n",st[i].x,st[i].y);
  32. }
  33. void get(){
  34. double ans=1e100;int a=1,b=1,c=1;
  35. fp(i,1,top-2){
  36. while((st[a+1]-st[i])*(st[i-1]-st[i])>=(st[a]-st[i])*(st[i-1]-st[i]))a=(a+1)%top;
  37. 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;
  38. if(i==1)c=a;
  39. 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;
  40. double dis=len(st[i]-st[i-1]);
  41. double L=dot(st[c]-st[i],st[i-1]-st[i])/dis;ab(L);
  42. double R=dot(st[b]-st[i-1],st[i]-st[i-1])/dis;ab(R);
  43. double H=area(st[i],st[i-1],st[a])/dis;ab(H);
  44. double tmp=(L+R-dis)*H;
  45. if(tmp<ans){
  46. ans=tmp;
  47. q[0]=st[i]-(st[i]-st[i-1])*(L/dis);
  48. q[1]=q[0]+(st[i]-st[i-1])*((L+R-dis)/dis);
  49. q[2]=q[1]+(st[b]-q[1])*(H/len(st[b]-q[1]));
  50. q[3]=q[2]+(st[i-1]-st[i])*((L+R-dis)/dis);
  51. }
  52. }printf("%.5lf\n",ans);
  53. }
  54. int main(){
  55. // freopen("testdata.in","r",stdin);
  56. scanf("%d",&n);graham();get();
  57. int s=0;
  58. 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;
  59. if(fabs(q[s].x)<=eps)q[s].x=0;if(fabs(q[s].y)<=eps)q[s].y=0;
  60. printf("%.5lf %.5lf\n",q[s].x,q[s].y);
  61. fp(i,1,3){
  62. s=(s+1)%4;
  63. if(fabs(q[s].x)<=eps)q[s].x=0;if(fabs(q[s].y)<=eps)q[s].y=0;
  64. printf("%.5lf %.5lf\n",q[s].x,q[s].y);
  65. }return 0;
  66. }

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

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

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

  2. 【旋转卡壳+凸包】BZOJ1185:[HNOI2007]最小矩形覆盖

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

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

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

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

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

  5. 【BZOJ1185】[HNOI2007]最小矩形覆盖(凸包,旋转卡壳)

    [BZOJ1185][HNOI2007]最小矩形覆盖(凸包,旋转卡壳) 题面 BZOJ 洛谷 题解 最小的矩形一定存在一条边在凸包上,那么枚举这条边,我们还差三个点,即距离当前边的最远点,以及做这条边 ...

  6. bzoj1185 [HNOI2007]最小矩形覆盖 旋转卡壳求凸包

    [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 2081  Solved: 920 ...

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

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

  8. BZOJ1185[HNOI2007] 最小矩形覆盖(旋转卡壳)

    BZOJ1185[HNOI2007] 最小矩形覆盖 题面 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点的坐标 分析 首先可以先求凸包,因为覆盖了凸包上的顶点,凸 ...

  9. LG3187 [HNOI2007]最小矩形覆盖

    题意 题目描述 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点坐标 输入输出格式 输入格式: 第一行为一个整数n(3<=n<=50000),从第2至第 ...

随机推荐

  1. Luogu P4549 裴蜀定理 / Min

    思路 题目已经给出了正解.我们只需要将裴蜀定理推广到若干数的线性组合就可以做这道题了 要注意的是需要在输入的时候取一个绝对值.因为可能会有负数存在.我之前也写过裴蜀定理的证明,要看的话点这里 吐槽 第 ...

  2. UVA - 1623 Enter The Dragon(贪心)

    题目: 思路: 读完题之后有了以下想法: 当遇到下雨的天,就找这个湖泊上一次下雨满了之后又一次不下雨的日期.有就在这个日期下记录被神龙喝干的湖的编号,没有就是不符合题意. 这个想法是对的,但是却被代码 ...

  3. Java 十二周总结

  4. 07 Python编码问题

    17) 编码 18) Python3的执行过程 19) 常见编码错误原因 20) 后附一部分编码详细信息(个人总结,有误望指正) 想了解Python3的编码更细致的讲解请参考大王的文章 http:// ...

  5. codechef 营养题 第一弹

    第一弾が始まる! 定期更新しない! 来源:http://wenku.baidu.com/link?url=XOJLwfgMsZp_9nhAK15591XFRgZl7f7_x7wtZ5_3T2peHh5 ...

  6. Python基础之生成器、迭代器

    一.字符串格式化进阶 Python的字符串格式化有两种方式: 百分号方式.format方式,由于百分号的方式相对来说比较老,在社区里讨论format方式有望取代百分号方式,下面我们分别介绍一下这两种方 ...

  7. saltstack(三) grains、pillar的使用

    一,grains grains: 这个跟puppet的facter功能一样.主要负责采集客户端一些基本信息, 这个也完全可以自定义,可以在客户端自定义,然后自动汇报上来:也可以从服务器端定义然后推下去 ...

  8. 【Codeforces 364A】Matrix

    [链接] 我是链接,点我呀:) [题意] 让你求出b[i][j]=s[i]*s[j]规则构成的矩阵 的所有子矩阵中子矩阵的和为a的子矩阵的个数 [题解] (x,y,z,t) 会发现它的和就是sum(x ...

  9. 定时任务-----Springboot中使用Scheduled做定时任务----http://www.cnblogs.com/lirenqing/p/6596557.html

    Springboot中使用Scheduled做定时任务---http://www.cnblogs.com/lirenqing/p/6596557.html 已经验证的方案: pom文件加入依赖 < ...

  10. Sky数

    Problem Description Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=2 ...