1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
| const double eps = 1e-8; const double inf = 1e20; const double pi = acos(-1.0);
int sgn(double x) { if (fabs(x) < eps) return 0; if (x < 0) return -1; return 1; } inline double sqr(double x) { return x * x; }
struct Point { double x, y; Point() {} Point(double _x, double _y) { x = _x; y = _y; }
void input() { cin >> x >> y; }
bool operator==(Point b) const { return sgn(x - b.x) == 0 && sgn(y - b.y) == 0; } bool operator<(Point b) const { return sgn(x - b.x) == 0 ? sgn(y - b.y) < 0 : x < b.x; } bool operator>(Point b) const { return sgn(x - b.x) == 0 ? sgn(y - b.y) > 0 : x > b.x; }
Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); } Point operator+(const Point &b) const { return Point(x + b.x, y + b.y); }
double operator*(const Point &b) const { return x * b.x + y * b.y; } double operator^(const Point &b) const { return x * b.y - y * b.x; }
double len() { return hypot(x, y); } double len2() { return x * x + y * y; }
double distance(Point p) { return hypot(x - p.x, y - p.y); }
Point operator*(const double &k) const { return Point(x * k, y * k); } Point operator/(const double &k) const { return Point(x / k, y / k); }
double rad(Point a, Point b) { Point p = *this; return fabs(atan2(fabs((a - p) ^ (b - p)), (a - p) * (b - p))); }
Point trunto(double r) { double l = len(); if (!sgn(l)) return *this; r /= l; return Point(x * r, y * r); }
Point rotleft() { return Point(-y, x); } Point rotright() { return Point(y, -x); }
Point rotate(Point p, double angle) { Point v = (*this) - p; double c = cos(angle), s = sin(angle); return Point(p.x + v.x * c - v.y * s, p.y + v.x * s + v.y * c); } };
vector<Point> Convex_Hull(vector<Point> pvec) { vector<Point> ch; ll n = pvec.size(); SORT(pvec); vector<ll> stk(n + 1); ll top = 0; stk[++top] = 0; vector<bool> used(n + 1, false); FORLL(i, 1, n - 1) { while (top > 1 && ((pvec[stk[top]] - pvec[stk[top - 1]])^(pvec[i] - pvec[stk[top]])) <= 0) used[stk[top--]] = false; stk[++top] = i; used[i] = true; } ll tmp = top; FORLL_rev(i, n - 2, 0) if (!used[i]) { while (top > tmp && ((pvec[stk[top]] - pvec[stk[top - 1]])^(pvec[i] - pvec[stk[top]])) <= 0) used[stk[top--]] = false; stk[++top] = i; used[i] = true; } FORLL(i, 1, top) ch.emplace_back(pvec[stk[i]]); return ch; }
|