#include #include #include #include using namespace std; #define PR 1e-8 #define N 50015 struct TPoint { double x,y; TPoint(){} TPoint(double _x,double _y):x(_x),y(_y){} TPoint operator-(const TPoint p) {return TPoint(x-p.x,y-p.y);} }ply[N]; int n; double MAX(double a,double b) {return a>b?a:b;} double dist(TPoint a,TPoint b) { TPoint c(b-a); return sqrt(c.x*c.x+c.y*c.y); } double cross(TPoint a,TPoint b,TPoint c) { TPoint s(b-a),t(c-a); return s.x*t.y-s.y*t.x; } int dblcmp(double a) { if(fabs(a)0?1:-1; } bool cmpx(TPoint a,TPoint b) { if(fabs(a.x-b.x)0||(d1==0&&dist(ply[0],a)1&&(dblcmp(cross(ply[top-2],ply[i],ply[top-1])))>=0) top--; ply[top++]=ply[i]; } double max1=-1e20,tmp; n=top; ply[n]=ply[0]; ply[n+1]=ply[1]; ply[n+2]=ply[2]; p=0; q=1; r=2; while(1) { int pp=p,qq=q,rr=r; while(cross(ply[p],ply[q],ply[r+1])-(tmp=cross(ply[p],ply[q],ply[r]))>PR) r=(r+1)%n; max1=MAX(max1,fabs(tmp)*0.5); while(cross(ply[p],ply[q+1],ply[r])-(tmp=cross(ply[p],ply[q],ply[r]))>PR) q=(q+1)%n; max1=MAX(max1,fabs(tmp)*0.5); while(cross(ply[p+1],ply[q],ply[r])-(tmp=cross(ply[p],ply[q],ply[r]))>PR) p=(p+1)%n; max1=MAX(max1,fabs(tmp)*0.5); if(pp==p&&qq==q&&rr==r) r=(r+1)%n; if(r==0) break; } if(n<3) max1=0; printf("%.2lf\n",max1); } return 0; }