#include #include #include using namespace std ; struct pt { double d(const pt &b) const { return hypot(b.x-x, b.y-y) ; } long long x, y ; } ; long long side(const pt &a, const pt &b, const pt &c) { pt ab{b.x-a.x, b.y-a.y}, ac{c.x-a.x, c.y-a.y} ; return ab.x*ac.y-ab.y*ac.x ; } vector convexhull(vector &pts) { vector r ; int lowpt = 0 ; for (int i=1; i 0 ; return pts[0].d(a) > pts[0].d(b) ; }) ; r.push_back(pts[1]) ; for (int i=2; i 0) { // cout << "Adding." << endl ; r.push_back(pts[i]) ; break ; } else if (pts[i].d(r[r.size()-2]) > r[r.size()-1].d(r[r.size()-2])) { // cout << "Popping2 " << r[r.size()-1].x << " " << r[r.size()-1].y << endl ; r.pop_back() ; // cout << "Adding." << endl ; r.push_back(pts[i]) ; break ; } else { // cout << "Skipping." << endl ; break ; } } } return r ; } long long area(const pt &a, const pt &b) { return (a.x-b.x)*(b.y+a.y) ; } long long area(const vector &pts) { long long r = area(pts[pts.size()-1], pts[0]) ; for (int i=0; i+1> N >> K ; vector pts(K) ; for (int i=0; i> x >> y ; pts[i] = pt{x, y} ; } vector fence = convexhull(pts) ; long long r = area(fence) ; for (int i=K; i> x >> y ; pts = fence ; pts.push_back(pt{x, y}) ; r = max(r, area(convexhull(pts))) ; } cout << (r/2) << ((r & 1) ? ".5" : ".0") << endl ; }