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\n",&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\n",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\n",t[be].x/100000.0,t[be].y/100000.0);

                be=be%4+1;

            }

        return 0;

  }
View Code

 

你可能感兴趣的:(ZOJ)