zoukankan      html  css  js  c++  java
  • bzoj1185

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1185

    裸的凸包外接矩形

    要注意两点:

    (1)输入时乘100000以减少误差

    (2)注意-0的输出

    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<fstream>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<map>
    #include<utility>
    #include<set>
    #include<bitset>
    #include<vector>
    #include<functional>
    #include<deque>
    #include<cctype>
    #include<climits>
    #include<complex>
    //#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj
     
    using namespace std;
    
    typedef long long LL;
    typedef double DB;
    typedef pair<int,int> PII;
    typedef complex<DB> CP;
    
    #define mmst(a,v) memset(a,v,sizeof(a))
    #define mmcy(a,b) memcpy(a,b,sizeof(a))
    #define re(i,a,b)  for(i=a;i<=b;i++)
    #define red(i,a,b) for(i=a;i>=b;i--)
    #define fi first
    #define se second
    #define m_p(a,b) make_pair(a,b)
    #define SF scanf
    #define PF printf
    #define two(k) (1<<(k))
    
    template<class T>inline T sqr(T x){return x*x;}
    template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
    template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}
    
    const DB EPS=1e-9;
    inline int sgn(DB x){if(abs(x)<EPS)return 0;return(x>0)?1:-1;}
    const DB Pi=acos(-1.0);
    
    inline int gint()
      {
            int res=0;bool neg=0;char z;
            for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
            if(z==EOF)return 0;
            if(z=='-'){neg=1;z=getchar();}
            for(;z!=EOF && isdigit(z);res=res*10+z-'0',z=getchar());
            return (neg)?-res:res; 
        }
    inline LL gll()
      {
          LL res=0;bool neg=0;char z;
            for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
            if(z==EOF)return 0;
            if(z=='-'){neg=1;z=getchar();}
            for(;z!=EOF && isdigit(z);res=res*10+z-'0',z=getchar());
            return (neg)?-res:res; 
        }
    
    const int maxN=50000;
    const DB INF=1e50;
    
    struct Tpoint
      {
          DB x,y;
          inline Tpoint(DB _x=0.0,DB _y=0.0){x=_x;y=_y;}
          inline void input(){scanf("%lf%lf
    ",&x,&y);x*=100000.0;y*=100000.0;}
      };
    
    inline DB det(Tpoint p0,Tpoint p1,Tpoint p2){return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}
    
    inline DB dist(Tpoint a,Tpoint b){return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));}
    
    inline DB area(Tpoint a,Tpoint st,Tpoint en){return abs(det(a,st,en))/2.0;}
    
    inline DB dot(Tpoint p1,Tpoint p2,Tpoint p3,Tpoint p4){return (p2.x-p1.x)*(p4.x-p3.x)+(p2.y-p1.y)*(p4.y-p3.y);}
    
    inline DB dot(Tpoint p0,Tpoint p1,Tpoint p2) {return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);}
    
    inline Tpoint foot(Tpoint st,Tpoint en,Tpoint a)
      {
          DB l1=dist(st,en),l2=dot(st,en,a)/l1;
          Tpoint res;
          res.x=(en.x-st.x)*(l2/l1)+st.x;
          res.y=(en.y-st.y)*(l2/l1)+st.y;
            return res;
      }
    
    int N;
    Tpoint p[maxN+100];
    
    inline bool cmp(Tpoint a,Tpoint b){return sgn(a.y-b.y)!=0?sgn(a.y-b.y)<0:sgn(a.x-b.x)<0;}
    int top;Tpoint sta[maxN+100];
    inline void tubao()
      {
          int i;
          sort(p+1,p+N+1,cmp);
          top=0;
          re(i,1,N)
            {
                while(top>1 && sgn(det(sta[top-1],sta[top],p[i]))<=0)top--;
                sta[++top]=p[i];
            }
          int m=top;
          red(i,N,1)
            {
                while(top>m && sgn(det(sta[top-1],sta[top],p[i]))<=0)top--;
                sta[++top]=p[i];
            }
          top--;
          N=top;
          re(i,1,top)p[i]=sta[i];
          p[N+1]=p[1];
      }
    
    DB ans;
    Tpoint t[5];
    
    int main()
      {
          freopen("square.in","r",stdin);
          freopen("square.out","w",stdout);
          int i;
          N=gint();
          re(i,1,N)p[i].input();
          p[N+1]=p[1];
          tubao();
          ans=INF;
          #define next(i) (i%N+1)
          int a=1,b=2,c=2,d=3;
          re(a,1,N)
            {
                while( sgn( area(p[c],p[a],p[next(a)]) - area(p[next(c)],p[a],p[next(a)]) ) < 0 ){c=next(c);if(c==d)d=next(d);}
                while( next(b)!=c && sgn( dot(p[a],p[next(a)],p[b],p[next(b)]) ) >=0 ) b=next(b);
                    while( next(d)!=a && sgn( dot(p[next(a)],p[a],p[d],p[next(d)]) ) >=0 ) d=next(d);
                    Tpoint r1,r2,r3,r4,z;
                    r1=foot(p[a],p[next(a)],p[b]);
                    r4=foot(p[a],p[next(a)],p[d]);
                    z=foot(p[a],p[next(a)],p[c]);
                    r2=Tpoint(r1.x+p[c].x-z.x,r1.y+p[c].y-z.y);
                    r3=Tpoint(r4.x+p[c].x-z.x,r4.y+p[c].y-z.y);
                    DB res=area(r1,r2,r4)*2.0;
                    if(sgn(res-ans)<0){ans=res;t[1]=r1;t[2]=r2;t[3]=r3;t[4]=r4;}
                }
            if(sgn(ans)==0) ans=0.0;
            printf("%0.5lf
    ",ans/10000000000.0);
            int be=1;
            re(i,2,4)if(cmp(t[i],t[be])) be=i;
            re(i,1,4)
              {
                  if(sgn(t[be].x)==0)t[be].x=0.0;
                  if(sgn(t[be].y)==0)t[be].y=0.0;
                  printf("%0.5lf %0.5lf
    ",t[be].x/100000.0,t[be].y/100000.0);
                    be=be%4+1;
                }
            return 0;
      }
    View Code
  • 相关阅读:
    day66
    1
    day65
    BeautifulSoup
    day60
    day59
    day49
    day48
    [S5PV210] PWM
    [S5PV210] Clock
  • 原文地址:https://www.cnblogs.com/maijing/p/4656407.html
Copyright © 2011-2022 走看看