一遇到数学题和计算几何题我就要调半天……

玛雅,我真是太弱了……

基本思路很简单,先上凸包,然后矩形与凸包一边重合,然后旋转卡壳即可

然而我没怎么写过计算几何题,一开始写的各种囧,后来看了hzwer的写法才写得正常一些

一开始写囧,是找矩形的左右边界,用勾股定理算的,囧得不行;

后来发现可以用点积来判断,点积的几何意义:向量A在向量B上投影的长度*向量B的长度

然后就很好做了

 const eps=1e-8;
 type point=record
        x,y:double;
      end;

 ..] of point;
     q:..] of longint;
     p:..] 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);
    to n do
     readln(a[i].x,a[i].y);
   sort(,n);
   ans:=1e15;
   t:=;
   q[]:=;
    to n do
   begin
     ) ],i,q[t-])<eps) do dec(t);
     inc(t);
     q[t]:=i;
   end;
   k:=t;
     do
   begin
     ],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:=;
     do
   begin
     d:=dis(a[q[i]],a[q[i+]]);
     ],q[i],q[k ],q[i])-cross(q[i+],q[i],q[k],q[i])>-eps ;
     ],q[i],q[r ],q[i])-mul(q[i+],q[i],q[r],q[i])>-eps) ;
      then h:=r;
     ],q[i],q[h ],q[i])-mul(q[i+],q[i],q[h],q[i])<eps) ;
     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,].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:=;
     do
     if cmp(p[i],p[h]) then h:=i;
     do
     writeln(p[(h+i) ].x::,].y::);
 end.

bzoj1185的更多相关文章

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

    求出凸包后,矩形的一条边一定与凸包的某条边重合. 枚举每条边,求出离它最远的点和离它最左最右的点,因为那三个点是单调变化的,所以复杂度为$O(n)$. 注意精度. #include<cstdio ...

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

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

随机推荐

  1. Largest Rectangle in a Histogram(DP)

    Largest Rectangle in a Histogram Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K ...

  2. KnockoutJS 3.X API 第五章 高级应用(1) 创建自定义绑定

    您不仅限于使用内置的绑定,如click,value绑定等,您可以创建自己的绑定. 这是如何控制视图模型如何与DOM元素进行交互,并且为您提供了大量的灵活性,以便于以复用的方式封装复杂的行为. 注册绑定 ...

  3. Javaweb---Servlet过滤器

    Servlet过滤器从字面上的字意理解为景观一层次的过滤处理才达到使用的要求,而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件,在实际项目开发中Servlet过滤器主要用于对浏览器的 ...

  4. 《BI项目笔记》多维数据集中度量值设计时的聚合函数

    Microsoft SQL Server Analysis Services 提供了几种函数,用来针对包含在度量值组中的维度聚合度量值.默认情况下,度量值按每个维度进行求和.但是,通过 Aggrega ...

  5. JavaScript中的String对象

        String对象提供的方法用于处理字符串及字符. 常用的一些方法: charAt(index):返回字符串中index处的字符. indexOf(searchValue,[fromIndex] ...

  6. IE下点击scrollbar会导致焦点移动到body

    现象 IE这货果然与众不同,当光标焦点在input时,点击同页面内其他区域的scrollbar,会导致焦点移动到body,从而触发绑定在input上的blur事件,如果input中的值与之前不同,甚至 ...

  7. [CareerCup] 7.2 Ants on Polygon 多边形上的蚂蚁

    7.2 There are three ants on different vertices of a triangle. What is the probability of collision ( ...

  8. [NOIP2010] 提高组 洛谷P1540 机器翻译

    题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...

  9. javascript AOP实现

    参考:http://www.cnblogs.com/rubylouvre/archive/2009/08/08/1541578.html function Person(){ this.say = f ...

  10. ubuntu 命令行软件包管理

    安装软件包 apt-get install vim 卸载 apt-get remove/autoremove vim autoremove 会顺便卸载未使用,未被依赖的软件包 查询或者搜索软件包:: ...