#include #include #include #include #include using namespace std ; using ll = long long ; using pt = pair ; vector pts ; ll n, m ; ll side(int a, int b, int c) { return (pts[b].second - pts[a].second) * (pts[c].first - pts[a].first) - (pts[b].first - pts[a].first) * (pts[c].second - pts[a].second) ; } double addarea(pt &a, pt &b) { if (a == b) return 0 ; return 0.5 * (a.second + b.second) * (b.first - a.first) ; } void rot(pt &a) { auto ny = a.first ; a.first = n - a.second ; a.second = ny ; } pt isect(int p1, int p2, int border) { pt a = pts[p1] ; pt b = pts[p2] ; for (int i=0; i> n >> m ; cout << setprecision(15) ; pts.resize(m+4) ; for (int i=0; i> pts[i].first >> pts[i].second ; pts[m+1].second = n ; pts[m+2].first = n ; pts[m+2].second = n ; pts[m+3].first = n ; double best = -1e30 ; for (int r=0; r<4; r++) { for (int i=0; i> sortme ; for (int j=0; j 0) { nx = isect(i, sortme[j].second, (pc+k+3)%4) ; area += addarea(prev, nx) ; prev = nx ; previ = nxi ; nx = pts[nxi] ; didvec = 2 ; } else { nx = prev ; } break ; case 2: if (t < 0) { cout << "Fail" << endl ; } else { nx = pts[nxi] ; } break ; } area += addarea(prev, nx) ; prev = nx ; previ = nxi ; } area /= (double)(n*n) ; } area = 1 - area ; // cout << "Cnt is " << cnt << " area is " << area << endl ; double t = cnt / (double)m - area ; best = max(t, best) ; while (j + 1 < el&& side(i, sortme[j].second, sortme[(j+1)%el].second) == 0) j++ ; } } cout << best << endl ; }