QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#582051#784. 旋转卡壳xorzj97 138ms19032kbC++1721.4kb2024-09-22 15:09:222024-09-22 15:09:23

Judging History

你现在查看的是最新测评结果

  • [2024-10-16 12:18:36]
  • hack成功,自动添加数据
  • (/hack/1005)
  • [2024-09-24 16:55:39]
  • hack成功,自动添加数据
  • (/hack/888)
  • [2024-09-22 15:09:23]
  • 评测
  • 测评结果:97
  • 用时:138ms
  • 内存:19032kb
  • [2024-09-22 15:09:22]
  • 提交

answer

#include <bits/stdc++.h>
#define rep(a, b, c) for (int a = b; a <= c; a++)
#define ALL(x) (x).begin(), (x).end()
#define IOS cin.tie(0)->sync_with_stdio(false)
#ifdef LOCAL
#include "debug.h"
#else
#define deb(...) 42
#endif
#define OPENSTACK
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int MAXN = 2e5 + 5;
const int INF = 0x3f3f3f3f;
typedef double db;
constexpr db inf = 1e20;
constexpr db eps = 1e-8;
const db pi = acos(-1);
constexpr int sgn(db x) { return x < -eps ? -1 : x > eps; }
constexpr int cmp(db x, db y) { return sgn(x - y); }
struct Point {
    db x, y;
    constexpr Point(db _x = 0, db _y = 0) : x(_x), y(_y) {}
    constexpr Point operator+() const noexcept { return *this; }
    constexpr Point operator-() const noexcept { return Point(-x, -y); }
    constexpr Point operator+(const Point& p) const
    {
        return Point(x + p.x, y + p.y);
    }
    constexpr Point operator-(const Point& p) const
    {
        return Point(x - p.x, y - p.y);
    }
    constexpr Point operator*(const db& k) { return Point(x * k, y * k); }
    constexpr Point operator/(const db& k) { return Point(x / k, y / k); }
    constexpr Point& operator+=(const Point& p)
    {
        return x += p.x, y += p.y, *this;
    }
    constexpr Point& operator-=(const Point& p)
    {
        return x -= p.x, y -= p.y, *this;
    }
    constexpr Point& operator*=(const db& k) { return x *= k, y *= k, *this; }
    constexpr Point& operator/=(const db& k) { return x /= k, y /= k, *this; }
    constexpr bool operator==(const Point& r) const noexcept
    {
        return cmp(x, r.x) == 0 and cmp(y, r.y) == 0;
    }
    constexpr bool operator<(const Point& r) const noexcept
    {
        return sgn(x - r.x) == 0 ? sgn(y - r.y) < 0 : x < r.x;
    }
    friend istream& operator>>(istream& is, Point& p) { return is >> p.x >> p.y; }
    friend ostream& operator<<(ostream& os, Point p)
    {
        return os << "(" << p.x << ", " << p.y << ")";
    }
    constexpr db dot(const Point& r) const { return x * r.x + y * r.y; }
    constexpr db cross(const Point& r) const { return x * r.y - y * r.x; }
    constexpr int quad() const
    {
        return sgn(y) > 0 || (sgn(y) == 0 && sgn(x) > 0) ? 1 : -1;
    }
    constexpr bool arg_cmp(const Point& r) const
    {
        int L = (*this).quad(), R = r.quad();
        if (L != R) return L < R;
        db X = x * r.y, Y = r.x * y;
        if (X != Y) return X > Y;
        return x < r.x;
    }
};
db dot(Point a, Point b) { return a.x * b.x + a.y * b.y; }
db cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }
db square(Point p) { return dot(p, p); }
db len(Point p) { return sqrt(db(square(p))); }
Point unit(Point p) { return p / len(p); }
db arg(Point p) { return atan2(p.y, p.x); }
Point polar(db r, db theta) { return Point(cos(theta) * r, sin(theta) * r); }
Point rotleft(Point p) { return Point(-p.y, p.x); }
Point rotright(Point p) { return Point(p.y, -p.x); }
Point rotate(Point p, Point r, db angle)
{
    Point v = p - r;
    db c = cos(angle), s = sin(angle);
    return Point(p.x + v.x * c - v.y * s, p.y + v.x * s + v.y * c);
}
// 1 : left, 0 : same, -1 : right
int toleft(Point a, Point b, Point c) { return sgn(cross(b - a, c - a)); }
int toleft(Point a, Point b) { return sgn(cross(a, b)); }
//(0,0) in negative plane
int quad(Point p)
{
    return sgn(p.y) > 0 || (sgn(p.y) == 0 && sgn(p.x) > 0) ? 1 : -1;
}
bool arg_cmp(const Point& l, const Point& r) { return l.arg_cmp(r); }
db distance(const Point& a, const Point& b) { return len(a - b); }
struct Line {
    Point a, b;
    Line() = default;
    Line(Point a, Point b) : a(a), b(b) {}
    Line(Point p, db angle)
    {
        a = p;
        if (cmp(angle, pi / 2) == 0)
            b = (a + Point(0, 1));
        else
            b = (a + Point(1, tan(angle)));
    }
    // ax + by + c = 0
    Line(db A, db B, db C)
    {
        if (sgn(A) == 0)
            a = Point(0, -C / B), b = Point(1, -C / B);
        else if (sgn(B) == 0)
            a = Point(-C / A, 0), b = Point(-C / A, 1);
        else
            a = Point(0, -C / B), b = Point(-C / A, 0);
    }
};
struct Segment : Line {
    Segment() = default;
    Segment(Point a, Point b) : Line(a, b) {}
};
db len(const Line& l) { return len(l.b - l.a); }
int toleft(Point p, Line l) { return sgn(cross(l.b - l.a, p - l.a)); }
bool parallel(Line l1, Line l2)
{
    return sgn(cross(l1.b - l1.a, l2.b - l2.a)) == 0;
}
bool orthogonal(const Line& l1, const Line& l2)
{
    return sgn(dot(l1.a - l1.b, l2.a - l2.b)) == 0;
}
#define crossOp(a, b) sgn(cross(a, b))
#define dotOp(a, b) sgn(dot(a, b))
// 两直线弧度
db rad(const Line& l1, const Line& l2)
{
    return atan2(fabs(cross(l1.b - l1.a, l2.b - l2.a)),
        dot(l1.b - l1.a, l2.b - l2.a));
}
// 返回直线倾斜角 0<=angle<π
db angle(const Line& l)
{
    db k = atan2(l.b.y - l.a.y, l.b.x - l.a.x);
    if (sgn(k) < 0) k += pi;
    if (sgn(k - pi) == 0) k -= pi;
    return k;
}
db distancePL(const Point& p, const Line& l)
{
    return fabs(cross(l.b - l.a, p - l.a)) / len(l);
}
db distancePS(const Point& p, const Segment& l)
{
    if (sgn(dot(p - l.a, l.b - l.a)) < 0) return distance(p, l.a);
    if (sgn(dot(p - l.b, l.a - l.b)) < 0) return distance(p, l.b);
    return distancePL(p, l);
}
int pointonsegment(Point a, Point b, Point c)
{
    b = b - a, c = c - a;
    if (cross(b, c) > 0) return +1;        // "COUNTER_CLOCKWISE"
    if (cross(b, c) < 0) return -1;        // "CLOCKWISE"
    if (dot(b, c) < 0) return +2;          // "ONLINE_BACK"
    if (square(b) < square(c)) return -2;  // "ONLINE_FRONT"
    return 0;                              // "ON_SEGMENT"
}
bool intersect(const Point& p, const Line& l)
{
    return abs(pointonsegment(l.a, l.b, p)) != 1;
}
bool intersect(const Point& p, const Segment& s)
{
    return pointonsegment(s.a, s.b, p) == 0;
}
bool intersect(const Line& l, const Line& m) { return !parallel(l, m); }
bool intersect(const Line& l, const Segment& s)
{
    return crossOp(l.b - l.a, s.a - l.a) * crossOp(l.b - l.a, s.b - l.a) <= 0;
}
bool intersect(const Segment& s, const Segment& t)
{
    return pointonsegment(s.a, s.b, t.a) * pointonsegment(s.a, s.b, t.b) <= 0 &&
        pointonsegment(t.a, t.b, s.a) * pointonsegment(t.a, t.b, s.b) <= 0;
}
db distanceSS(const Segment& l, const Segment& m)
{
    if (intersect(l, m)) return 0.0;
    return min({ distancePS(l.a, m), distancePS(l.b, m), distancePS(m.a, l),
                distancePS(m.b, l) });
}
// 2 规范相交 1 非规范相交 0 不相交
int crossSS(Segment l, Segment m)
{
    int d1 = toleft(m.a, l);
    int d2 = toleft(m.b, l);
    int d3 = toleft(l.a, m);
    int d4 = toleft(l.b, m);
    if ((d1 ^ d2) == -2 && (d3 ^ d4) == -2) return 2;
    return (d1 == 0 && intersect(m.a, l)) || (d2 == 0 && intersect(m.b, l)) ||
        (d3 == 0 && intersect(l.a, m)) || (d4 == 0 && intersect(l.b, m));
}
// 2 规范相交 1 非规范相交 0 不相交
int crossLS(Line l, Segment m)
{
    int d1 = toleft(m.a, l);
    int d2 = toleft(m.b, l);
    if ((d1 ^ d2) == -2) return 2;
    return (d1 == 0 || d2 == 0);
}
// 0 平行 1 重合 2 相交
int crossLL(Line l, Line m)
{
    if (parallel(l, m)) return intersect(l.a, m);
    return 2;
}
Point crosspointLL(const Line& l, const Line& m)
{
    db A = cross(l.b - l.a, m.b - m.a);
    db B = cross(l.b - l.a, l.b - m.a);
    if (sgn(A) == 0 and sgn(B) == 0) return m.a;
    return m.a + (m.b - m.a) * (B / A);
}
// 点到直线投影点
Point projection(const Point& p, const Line& l)
{
    db t = dot(p - l.a, l.a - l.b) / square(l.a - l.b);
    return l.a + (l.a - l.b) * t;
}
// 直线对称点
Point symmetrypoint(const Point& p, const Line& l)
{
    Point q = projection(p, l);
    return Point(2 * q.x - p.x, 2 * q.y - p.y);
}
using P = Point;
using Points = vector<P>;
using Polygon = Points;
// 周长
db perimeter(const Polygon& p)
{
    db res = 0;
    int n = p.size();
    for (int i = 0; i < n; i++) res += len(p[i] - p[(i + 1) % n]);
    return res;
}
// 面积两倍
db area2(const Polygon& p)
{
    db res = 0;
    int n = p.size();
    for (int i = 0; i < n; i++) res += cross(p[i], p[(i + 1) % n]);
    return res;
}
// 凸性判定 逆时针给出点
bool is_convex(const Polygon& p)
{
    int n = (int) p.size();
    for (int i = 0; i < n; i++) {
        if (pointonsegment(p[(i + n - 1) % n], p[i], p[(i + 1) % n]) == -1)
            return false;
    }
    return true;
}

enum { OUT, ON, IN };
// 2 contains 1 on segment 0 out
int pointInPolygon(const Point& a, const Polygon& p)
{
    int n = p.size();
    for (int i = 0; i < n; i++) {
        if (intersect(a, Segment(p[i], p[(i + 1) % n]))) return ON;
    }
    int t = 0;
    for (int i = 0; i < n; i++) {
        auto u = p[i];
        auto v = p[(i + 1) % n];
        if (cmp(u.x, a.x) == -1 && cmp(v.x, a.x) >= 0 &&
            toleft(a, Line(v, u)) > 0) {
            t ^= 1;
        }
        if (cmp(u.x, a.x) >= 0 && cmp(v.x, a.x) == -1 &&
            toleft(a, Line(u, v)) > 0) {
            t ^= 1;
        }
    }
    return t == 1 ? IN : OUT;
}
// 凸多边形log求包含点问题
int pointInconvexPolygonlog(const Point& p, const Polygon& Q)
{
    int N = (int) Q.size();
    Point g = (Q[0] + Q[N / 3] + Q[N * 2 / 3]) / 3.0;
    if (g == p) return IN;
    Point gp = p - g;
    int l = 0, r = N;
    while (r - l > 1) {
        int mid = (l + r) / 2;
        Point gl = Q[l] - g;
        Point gm = Q[mid] - g;
        if (cross(gl, gm) > 0) {
            if (cross(gl, gp) >= 0 && cross(gm, gp) <= 0)
                r = mid;
            else
                l = mid;
        }
        else {
            if (cross(gl, gp) <= 0 && cross(gm, gp) >= 0)
                l = mid;
            else
                r = mid;
        }
    }
    r %= N;
    db v = cross(Q[l] - p, Q[r] - p);
    return sgn(v) == 0 ? ON : sgn(v) == -1 ? OUT : IN;
}
bool segmentInPolygon(const Segment& s, const Polygon& p)
{
    auto [a, b] = s;
    if (pointInPolygon(a, p) == 0 || pointInPolygon(b, p) == 0) return false;
    int n = p.size();
    Polygon q;
    for (int i = 0; i < n; i++) {
        auto l = Segment(p[i], p[(i + 1) % n]);
        if (crossSS(s, l) == 2) return false;
        if (intersect(a, l))
            q.push_back(a);
        else if (intersect(b, l))
            q.push_back(b);
        else if (intersect(p[i], l))
            q.push_back(p[i]);
    }
    sort(q.begin(), q.end());
    for (int i = 0; i + 1 < q.size(); i++) {
        if (pointInPolygon((q[i] + q[i + 1]) / 2, p) == 0) return false;
    }
    return true;
}
bool intersect(const Polygon& ps, const Polygon& qs)
{
    int pl = ps.size(), ql = qs.size(), i = 0, j = 0;
    while ((i < pl or j < ql) and (i < 2 * pl) and (j < 2 * ql)) {
        auto ps0 = ps[(i + pl - 1) % pl], ps1 = ps[i % pl];
        auto qs0 = qs[(j + ql - 1) % ql], qs1 = qs[j % ql];
        if (intersect(Segment(ps0, ps1), Segment(qs0, qs1))) return true;
        Point a = ps1 - ps0;
        Point b = qs1 - qs0;
        db v = cross(a, b);
        db va = cross(qs1 - qs0, ps1 - qs0);
        db vb = cross(ps1 - ps0, qs1 - ps0);
        if (!v and va < 0 and vb < 0) return false;
        if (!v and !va and !vb) {
            i += 1;
        }
        else if (v >= 0) {
            if (vb > 0)
                i += 1;
            else
                j += 1;
        }
        else {
            if (va > 0)
                j += 1;
            else
                i += 1;
        }
    }
    return false;
}
// 凸包
Polygon getHull(Polygon p)
{
    Polygon h, l;
    sort(p.begin(), p.end());
    p.erase(unique(p.begin(), p.end()), p.end());
    if (p.size() <= 1) return p;
    for (auto a : p) {
        //<= >= 弹出共线点 < >不弹出共线点
        while (h.size() > 1 && cross(a - h.back(), a - h[h.size() - 2]) <= 0)
            h.pop_back();
        while (l.size() > 1 && cross(a - l.back(), a - l[l.size() - 2]) >= 0)
            l.pop_back();
        l.push_back(a);
        h.push_back(a);
    }
    l.pop_back();
    reverse(h.begin(), h.end());
    h.pop_back();
    l.insert(l.end(), h.begin(), h.end());
    return l;
}
// 平面割 返回l左侧的多边形,凸多边形
Polygon convex_cut(const Polygon& a, const Line& l)
{
    Polygon ret;
    int n = a.size();
    for (int i = 0; i < n; i++) {
        const Point& now = a[i];
        const Point& nxt = a[(i + 1) % n];
        auto cf = toleft(now, l);
        auto cs = toleft(nxt, l);
        if (cf >= 0) {
            ret.emplace_back(now);
        }
        if (cf * cs < 0) {
            ret.emplace_back(crosspointLL(Line(now, nxt), l));
        }
    }
    return ret;
}
// 最远点对(旋转卡壳)凸多边形
db rotatingCalipers(Polygon a)
{
    int n = a.size();
    if (n <= 2) return distance(a[0], a[1]);
    int i = 0, j = 0;
    for (int k = 0; k < n; k++) {
        if (a[k] < a[i]) i = k;
        if (a[j] < a[k]) j = k;
    }
    db res = 0;
    int si = i, sj = j;
    while (i != sj || j != si) {
        res = max(res, distance(a[i], a[j]));
        if (crossOp(a[(i + 1) % n] - a[i], a[(j + 1) % n] - a[j]) < 0)
            i = (i + 1) % n;
        else
            j = (j + 1) % n;
    }
    return res;
}
// 分治法最近点对
db closestPair(Polygon s)
{
    sort(s.begin(), s.end());
    int n = s.size();
    if (n <= 1) return inf;
    int m = n / 2;
    db x = s[m].x;
    db res = min(closestPair(Polygon(s.begin(), s.begin() + m)),
        closestPair(Polygon(s.begin() + m, s.end())));
    sort(s.begin(), s.end());
    deque<int> deq;
    for (int i = 0; i < n; i++) {
        if (cmp(abs(s[i].x - x), res) >= 0) continue;
        while (!deq.empty() && cmp(s[deq.front()].y, s[i].y - res) <= 0)
            deq.pop_front();
        for (auto e : deq) res = min(res, distance(s[i], s[e]));
        deq.push_back(i);
    }
    return res;
}
struct Circle {
    Point o;
    db r;
    Circle() {}
    Circle(Point o_, db r_) { o = o_, r = r_; }
    friend istream& operator>>(istream& is, Circle& c)
    {
        return is >> c.o >> c.r;
    }
};
// 4 相离 3 外切 2 相交 1 内切 0 包含
int crossCC(Circle c1, Circle c2)
{
    if (c1.r < c2.r) swap(c1, c2);
    db d = len(c1.o - c2.o);
    if (sgn(c1.r + c2.r - d) == -1) return 4;
    if (sgn(c1.r + c2.r - d) == 0) return 3;
    if (sgn(c1.r - c2.r - d) == -1) return 2;
    if (sgn(c1.r - c2.r - d) == 0) return 1;
    return 0;
}
int pointInCircle(const Point& p, const Circle& c)
{
    db d = distance(c.o, p);
    int cp = cmp(d, c.r);
    if (cp > 0) return OUT;
    if (cp < 0) return IN;
    return ON;
}
Circle incircle_triangle(Point a, Point b, Point c)
{
    db A = len(b - c), B = len(c - a), C = len(a - b);
    Point o = a * A + b * B + c * C;
    o /= A + B + C;
    db r = len(cross(o - a, b - a) / len(b - a));
    return { o, r };
}
Circle circumcircle_triangle(Point a, Point b, Point c)
{
    db A = square(b - c);
    db B = square(c - a);
    db C = square(a - b);
    db s = A * (B + C - A), t = B * (C + A - B), u = C * (A + B - C);
    db l = s + t + u;
    s /= l, t /= l, u /= l;
    Point o = a * s + b * t + c * u;
    db r = len(a - o);
    return { o, r };
}
bool intersect(const Circle& c, const Line& l)
{
    return cmp(c.r, distancePL(c.o, l)) >= 0;
}
//  0 圆的外部,内部包括圆上包含线段 1 严格穿过圆
//  2圆心在s的投影点在线段s上(不包括端点)
int intersect(const Circle& c, const Segment& s)
{
    Point h = projection(c.o, s);
    if (cmp(distance(c.o, h), c.r) > 0) return 0;
    db d1 = len(c.o - s.a), d2 = len(c.o - s.b);
    if (cmp(c.r, d1) >= 0 && cmp(c.r, d2) >= 0) return 0;
    if (cmp(c.r, d1) * cmp(c.r, d2) < 0) return 1;
    if (sgn(dot(s.a - h, s.b - h)) < 0) return 2;
    return 0;
}

// l1 l2 的对称轴
vector<Line> corner(Line l1, Line l2)
{
    vector<Line> res;
    if (parallel(l1, l2)) {
        db d = distancePL(l2.a, l1) / 2.0;
        Point v1 = l1.b - l1.a;
        v1 = unit(v1) * d;
        Point p = l2.a + rotleft(v1);
        db d1 = distancePL(p, l1);
        db d2 = distancePL(p, l2);
        if (abs(d1 - d2) > d) {
            p = l2.a + rotright(v1);
        }
        res.push_back(Line(p, p + v1));
    }
    else {
        Point p = crosspointLL(l1, l2);
        Point v1 = l1.b - l1.a, v2 = l2.b - l2.a;
        v1 = unit(v1);
        v2 = unit(v2);
        res.push_back(Line(p, p + (v1 + v2)));
        res.push_back(Line(p, p + rotleft(v1 + v2)));
    }
    return res;
}
vector<Point> crosspointCL(Circle c, Line l)
{
    Point h = projection(c.o, l);
    db d = c.r * c.r - square(c.o - h);
    if (sgn(d) == -1) return {};
    if (sgn(d) == 0) return { h };
    Point x = unit(l.a - l.b) * sqrt(d);
    return { h - x, h + x };
}
Polygon crosspointCS(const Circle& c, const Segment& s)
{
    int num = intersect(c, s);
    if (num == 0) return {};
    auto res = crosspointCL(c, Line(s.a, s.b));
    if (num == 2) return res;
    if (sgn(dot(s.a - res[0], s.b - res[0])) > 0) swap(res[0], res[1]);
    return { res[0] };
}
Polygon crosspointCC(Circle c1, Circle c2)
{
    db r1 = c1.r, r2 = c2.r;
    if (r1 < r2) return crosspointCC(c2, c1);
    db d = len(c2.o - c1.o);
    int op = crossCC(c1, c2);
    if (op == 4 || op == 0) return {};
    Point v = c2.o - c1.o;
    if (op == 3 || op == 1) return { c1.o + unit(v) * r1 };
    db p = ((r1 * r1 - r2 * r2) / d + d) / 2, q = sqrt(r1 * r1 - p * p);
    Point h = c1.o + unit(v) * p;
    Point i = unit(rotleft(v));
    return { h + i * q, h - i * q };
}
// p1,p2 的角平分线 在p1p2逆时针方向
Line bisector(Point p1, Point p2)
{
    Circle c1 = Circle(p1, len(p1 - p2)), c2 = Circle(p2, len(p1 - p2));
    auto p = crosspointCC(c1, c2);
    if (cross(p2 - p1, p[0] - p1) > 0) swap(p[0], p[1]);
    return Line(p[0], p[1]);
}
// 点到圆的切点
Polygon tangent_to_circle(const Circle& c, const Point& p)
{
    return crosspointCC(c, Circle(p, sqrt(square(c.o - p) - c.r * c.r)));
}
// 两圆公切线
vector<Line> common_tangent(const Circle& c1, const Circle& c2)
{
    if (c1.r < c2.r) return common_tangent(c2, c1);
    vector<Line> res;
    db g = distance(c1.o, c2.o);
    if (sgn(g) == 0) return res;
    Point u = (c2.o - c1.o) / g, v = rotleft(u);
    // -1 外公切线 1 内公切线
    for (int s : {-1, 1}) {
        db h = (c1.r + c2.r * s) / g;
        if (cmp(1, h * h) == 0)
            res.emplace_back(c1.o + u * c1.r, c1.o + (u + v) * c1.r);
        else if (cmp(1, h * h) > 0) {
            Point U = u * h, V = v * sqrt(1 - h * h);
            res.emplace_back(c1.o + (U + V) * c1.r, c2.o - (U + V) * c2.r * s);
            res.emplace_back(c1.o + (U - V) * c1.r, c2.o - (U - V) * c2.r * s);
        }
    }
    return res;
}
// 三角剖分 一个端点在圆心的三角形和圆的2倍面积并
db commonarea_impl(const Circle& c, const Point& a, const Point& b)
{
    auto va = c.o - a, vb = c.o - b;
    db f = cross(va, vb), res = 0;
    if (sgn(f) == 0) return res;
    if (cmp(max(len(va), len(vb)), c.r) <= 0) return f;
    if (cmp(distancePS(c.o, Segment(a, b)), c.r) >= 0)
        return c.r * c.r * arg(Point(dot(va, vb), cross(va, vb)));
    auto cand = crosspointCS(c, Segment(a, b));
    if (cand.empty()) return res;
    if (cand.size() > 1u && dot(cand[1] - cand[0], a - cand[0]) > 0)
        swap(cand[0], cand[1]);
    cand.emplace(cand.begin(), a);
    cand.emplace_back(b);
    for (int i = 0; i + 1 < cand.size(); i++)
        res += commonarea_impl(c, cand[i], cand[i + 1]);
    return res;
}
db commonarea(const Circle& c, const Polygon& P)
{
    if (P.size() < 3) return 0;
    db res = 0;
    int n = P.size();
    for (int i = 0; i < n; i++) res += commonarea_impl(c, P[i], P[(i + 1) % n]);
    return res / 2;
}
db commonarea(Circle c1, Circle c2)
{
    db r1 = c1.r, r2 = c2.r;
    db d = len(c1.o - c2.o);
    if (cmp(r1 + r2, d) <= 0) return 0;
    if (cmp(fabs(r1 - r2), d) >= 0) return pi * min(r1, r2) * min(r1, r2);
    db res = 0;
    for (int _ = 0; _ < 2; _++) {
        r1 = c1.r, r2 = c2.r;
        db cosine = (d * d + r1 * r1 - r2 * r2) / (2 * d * r1);
        db theta = acos(cosine) * 2;
        res += (theta - sin(theta)) * r1 * r1 / 2;
        swap(c1, c2);
    }
    return res;
}
// 已知两点半径,求圆心位置
vector<Point> center_given_radius(const Point& a, const Point& b, const db& r)
{
    Point m = (b - a) * 0.5;
    db d1 = len(m);
    if (sgn(d1) == 0 || d1 > r) return {};
    db d2 = sqrt(r * r - d1 * d1);
    Point n = rotleft(m) * d2 / d1;
    Point p = a + m - n, q = a + m + n;
    if (p == q) return { p };
    return { p, q };
}

void solve()
{
    int n;
    cin >> n;
    Polygon P(n);
    for (int i = 0; i < n; i++)cin >> P[i];
    cout << fixed << setprecision(10) << rotatingCalipers(P) << "\n";
}
int main()
{
#ifdef LOCAL
#ifdef OPENSTACK
    int size = 128 << 20; // 64MB
    char* p = (char*) malloc(size) + size;
#if (defined _WIN64) or (defined __unix)
    __asm__("movq %0, %%rsp\n" ::"r"(p));
#else
    __asm__("movl %0, %%esp\n" ::"r"(p));
#endif
#endif
#endif
    IOS;
    int _ = 1;
    while (_--) {
        solve();
    }
#ifdef LOCAL
#ifdef OPENSTACK
    exit(0);
#else
    return 0;
#endif
#endif
}

詳細信息

Subtask #1:

score: 10
Accepted

Test #1:

score: 10
Accepted
time: 1ms
memory: 3928kb

input:

1000
0 0
-997615 -8573
-1988394 -28911
-2726572 -44296
-3491635 -60392
-4419752 -82814
-5298550 -105946
-5723430 -118453
-6608257 -147267
-7034966 -161982
-7563964 -181682
-8507871 -222865
-9499799 -271846
-10090186 -303547
-10400262 -322989
-10614073 -339725
-11081438 -378596
-11791568 -439127
-127...

output:

274339223.1895614266

result:

ok found '274339223.1895614', expected '274339223.1895614', error '0.0000000'

Test #2:

score: 10
Accepted
time: 1ms
memory: 3896kb

input:

1000
0 0
-887614 -1937
-1459359 -3808
-2421409 -24096
-3273181 -48456
-3917594 -76664
-4402753 -100164
-5375022 -150897
-5993935 -192089
-6587159 -238825
-7549680 -333298
-8330993 -416479
-9244392 -515027
-10010900 -598589
-10374584 -640275
-10767641 -686907
-11173081 -741316
-11821952 -833327
-1260...

output:

262687047.9274906218

result:

ok found '262687047.9274906', expected '262687047.9274906', error '0.0000000'

Test #3:

score: 10
Accepted
time: 1ms
memory: 3932kb

input:

1000
0 0
-631055 -2758
-1328409 -7463
-2248672 -20536
-2412978 -23564
-2659543 -28441
-3383179 -43406
-4183375 -64326
-4856658 -88337
-5799682 -134822
-6757348 -189404
-7132846 -212164
-7563226 -242116
-8368716 -300012
-9321463 -381770
-9831821 -432746
-10409503 -491057
-11360852 -607259
-11874199 -...

output:

257868038.6435896754

result:

ok found '257868038.6435897', expected '257868038.6435897', error '0.0000000'

Test #4:

score: 10
Accepted
time: 1ms
memory: 3924kb

input:

1000
0 0
-48652 -588
-951356 -20091
-1517426 -33325
-1965414 -51971
-2466111 -74904
-3046762 -103888
-3555833 -132002
-3976901 -156059
-4972848 -245498
-5921476 -332492
-6353035 -375491
-7327511 -496188
-7939064 -575429
-8842272 -694656
-9246222 -756797
-9771758 -860630
-10633761 -1031205
-10981774 ...

output:

259539672.4804533720

result:

ok found '259539672.4804534', expected '259539672.4804534', error '0.0000000'

Test #5:

score: 10
Accepted
time: 1ms
memory: 3988kb

input:

1000
0 0
-456569 -2668
-1141521 -7887
-1270801 -8967
-1971135 -21206
-2919889 -38188
-3903859 -71231
-4752603 -107450
-5508682 -143873
-6214620 -183392
-6718977 -212193
-7452291 -271600
-8408796 -354998
-9261882 -432674
-9528618 -457608
-10099091 -513153
-10320120 -535958
-11067358 -614356
-12050731...

output:

250217366.4826218486

result:

ok found '250217366.4826218', expected '250217366.4826218', error '0.0000000'

Test #6:

score: 10
Accepted
time: 1ms
memory: 3852kb

input:

1000
0 0
-794019 -17307
-1389128 -41522
-1928884 -68000
-2530256 -103641
-3335109 -158872
-4273633 -225636
-4655012 -253747
-5584931 -329387
-6190262 -382029
-6657521 -422826
-7445510 -497270
-8092482 -562235
-8879759 -646264
-9688106 -745847
-10545954 -857573
-11350736 -962711
-12106702 -1066386
-1...

output:

256130723.0053679943

result:

ok found '256130723.0053680', expected '256130723.0053680', error '0.0000000'

Test #7:

score: 10
Accepted
time: 1ms
memory: 3848kb

input:

1000
0 0
-785524 -1241
-1228373 -2123
-1584480 -5108
-2516949 -19826
-3109735 -51256
-3799285 -95138
-4215892 -125263
-5144743 -202941
-6071171 -287679
-6844072 -376760
-7786583 -487933
-8491316 -575443
-9458832 -700691
-9848966 -756816
-10135682 -798578
-11100151 -940696
-11527785 -1004652
-1221960...

output:

268992022.0570692420

result:

ok found '268992022.0570692', expected '268992022.0570692', error '0.0000000'

Test #8:

score: 10
Accepted
time: 1ms
memory: 3936kb

input:

1000
0 0
-787651 -697
-1319793 -8691
-1545057 -12462
-2239671 -24650
-2487763 -36810
-2983386 -61694
-3408212 -85910
-3650815 -105325
-4268088 -155258
-5088483 -225550
-5720403 -280762
-6036913 -309102
-6663280 -365291
-7656626 -456948
-8462737 -538137
-9318271 -628471
-9704990 -671367
-10363047 -74...

output:

251395356.7229873240

result:

ok found '251395356.7229873', expected '251395356.7229873', error '0.0000000'

Test #9:

score: 10
Accepted
time: 1ms
memory: 3936kb

input:

1000
0 0
-895815 -18037
-1536713 -40507
-2439825 -73040
-2896761 -94230
-3815334 -138606
-4520738 -176711
-4997585 -208924
-5399492 -237632
-5629592 -254751
-6518310 -320902
-7084766 -367663
-7724052 -423029
-8475256 -492590
-9071702 -551527
-9798581 -626155
-10535448 -702512
-11155572 -768931
-1208...

output:

259639018.6166957319

result:

ok found '259639018.6166957', expected '259639018.6166958', error '0.0000000'

Test #10:

score: 10
Accepted
time: 1ms
memory: 3944kb

input:

1000
0 0
-837332 -2192
-1593910 -10845
-2320576 -25425
-3294539 -45660
-4178010 -82673
-4936159 -128518
-5796274 -190640
-6313517 -228540
-7131129 -291797
-7751205 -354513
-8357330 -419926
-9355375 -542247
-9783911 -596434
-10313681 -667126
-10377189 -675659
-10824619 -750345
-11653618 -894218
-1234...

output:

267554454.1762451231

result:

ok found '267554454.1762451', expected '267554454.1762451', error '0.0000000'

Test #11:

score: 10
Accepted
time: 1ms
memory: 3920kb

input:

1000
0 0
-758133 -3909
-1146524 -7212
-1823781 -16200
-2561994 -26923
-3448934 -43815
-4337557 -80953
-4912706 -106752
-5770093 -182352
-6645519 -261073
-7156648 -309532
-7882740 -380211
-8731241 -470527
-9265139 -532092
-10083113 -633235
-10767248 -721935
-11729364 -862416
-12112647 -921658
-128310...

output:

259903024.7335910201

result:

ok found '259903024.7335910', expected '259903024.7335910', error '0.0000000'

Test #12:

score: 10
Accepted
time: 0ms
memory: 3992kb

input:

1000
0 0
-220082 -1509
-1148190 -9207
-2108923 -22196
-2713299 -30623
-3364648 -43866
-3891571 -54675
-4300261 -63335
-4622311 -72814
-5235380 -91992
-5680720 -106355
-6138401 -121807
-7013302 -160828
-7784753 -195568
-8750494 -245022
-9681201 -295430
-10320328 -334255
-11256371 -407963
-12199734 -4...

output:

261658565.5826949477

result:

ok found '261658565.5826949', expected '261658565.5826949', error '0.0000000'

Test #13:

score: 10
Accepted
time: 1ms
memory: 3848kb

input:

1000
0 0
-425515 -4558
-1293469 -14675
-1990220 -30271
-2703160 -49015
-3455818 -76450
-4210140 -107243
-4530367 -120805
-5136478 -158180
-5732363 -196472
-6247394 -230823
-7100635 -290064
-7703961 -335663
-8091361 -368200
-8752153 -427341
-9433796 -491521
-10139006 -563945
-10984402 -653149
-113386...

output:

256353710.9730163217

result:

ok found '256353710.9730163', expected '256353710.9730163', error '0.0000000'

Test #14:

score: 10
Accepted
time: 0ms
memory: 3852kb

input:

1000
0 0
-572806 -2255
-1477072 -15611
-1643871 -18681
-2578790 -51107
-3303402 -86192
-4032032 -123256
-4540711 -150307
-5462171 -206756
-6377222 -264514
-6921545 -316752
-7623842 -390821
-8329739 -466169
-9034451 -568935
-9600887 -653814
-9729771 -674650
-10461476 -795876
-11348904 -952387
-117122...

output:

255498134.5157807171

result:

ok found '255498134.5157807', expected '255498134.5157807', error '0.0000000'

Test #15:

score: 10
Accepted
time: 1ms
memory: 3992kb

input:

1000
0 0
-723350 -3997
-1405147 -10223
-2296494 -21394
-2876280 -32357
-3572827 -51397
-4452032 -87137
-4953249 -111910
-5388609 -141252
-5731586 -165403
-6101332 -197003
-6884756 -282055
-7719066 -372715
-8101214 -415308
-8855617 -516206
-9316024 -579909
-10091662 -705732
-10621099 -799022
-1137369...

output:

258992362.5300114155

result:

ok found '258992362.5300114', expected '258992362.5300114', error '0.0000000'

Test #16:

score: 10
Accepted
time: 1ms
memory: 3912kb

input:

1000
0 0
-638945 -769
-1345094 -2633
-2049372 -9786
-3043001 -20660
-3832821 -40968
-4616354 -61996
-5489016 -89554
-6075577 -112116
-7059918 -153506
-7917375 -193461
-8704241 -235730
-9411173 -289585
-9928254 -332456
-10816688 -407937
-11522358 -469782
-12333778 -541183
-12532282 -560003
-13293480 ...

output:

260884926.0498460531

result:

ok found '260884926.0498461', expected '260884926.0498461', error '0.0000000'

Test #17:

score: 10
Accepted
time: 1ms
memory: 3868kb

input:

1000
0 0
-929784 -9273
-1222089 -14360
-1633168 -22589
-2271669 -42262
-2863939 -61639
-3538074 -85549
-4537727 -127500
-5529674 -172462
-6106076 -217405
-6615381 -262810
-7383575 -342936
-8289266 -445052
-8474592 -467243
-9285779 -564519
-10059545 -662251
-10774681 -753541
-11666601 -869701
-120587...

output:

259788149.3996045291

result:

ok found '259788149.3996045', expected '259788149.3996045', error '0.0000000'

Test #18:

score: 10
Accepted
time: 1ms
memory: 3988kb

input:

1000
0 0
-436597 -2249
-897574 -4839
-1763026 -9858
-2199595 -14239
-2837069 -24431
-3656371 -67025
-4153771 -93216
-5062244 -151716
-5634320 -190859
-6503474 -278174
-7250273 -366225
-7276046 -369834
-7806600 -448708
-8317734 -530915
-8905662 -634997
-9766507 -790590
-9973653 -831916
-10555366 -955...

output:

277834510.7780300379

result:

ok found '277834510.7780300', expected '277834510.7780300', error '0.0000000'

Test #19:

score: 10
Accepted
time: 1ms
memory: 3848kb

input:

1000
0 0
-499456 -5028
-1395210 -19193
-2095999 -36599
-2278240 -43145
-2754419 -63055
-3701264 -104359
-4078225 -133214
-4292562 -151446
-5087031 -220375
-5649235 -277762
-6403916 -358749
-7403700 -470022
-7940233 -537110
-8433330 -607694
-9376563 -746831
-9903004 -831307
-10718505 -965214
-1171369...

output:

261984352.6271107793

result:

ok found '261984352.6271108', expected '261984352.6271108', error '0.0000000'

Test #20:

score: 10
Accepted
time: 1ms
memory: 4012kb

input:

1000
0 0
-347123 -2330
-1296972 -12856
-2114794 -28811
-3005647 -54768
-3802579 -79440
-4777546 -118441
-5386348 -146049
-6230831 -184743
-7083665 -250364
-7963538 -324047
-8621014 -381656
-9065618 -421654
-9883960 -496406
-10349110 -541972
-11146897 -621572
-12108943 -718091
-12921588 -803916
-1348...

output:

265979549.5809911788

result:

ok found '265979549.5809912', expected '265979549.5809912', error '0.0000000'

Subtask #2:

score: 30
Accepted

Dependency #1:

100%
Accepted

Test #21:

score: 30
Accepted
time: 9ms
memory: 4200kb

input:

30000
0 0
-27842 -9
-56782 -24
-64412 -29
-91618 -47
-121087 -68
-152541 -123
-182316 -183
-212916 -274
-234159 -341
-266126 -446
-289328 -523
-317883 -637
-340594 -728
-350940 -781
-374263 -905
-400736 -1046
-427862 -1199
-450458 -1327
-465289 -1413
-485809 -1534
-517032 -1724
-548368 -1921
-576015...

output:

254843548.6986402571

result:

ok found '254843548.6986403', expected '254843548.6986403', error '0.0000000'

Test #22:

score: 30
Accepted
time: 9ms
memory: 4268kb

input:

30000
0 0
-31209 -21
-39334 -27
-64601 -46
-86568 -64
-115119 -89
-143398 -117
-161108 -154
-179520 -196
-203131 -254
-234209 -335
-252923 -396
-275417 -473
-289767 -533
-311588 -627
-343100 -821
-369994 -998
-385492 -1101
-412257 -1281
-427669 -1387
-453860 -1575
-485750 -1817
-510891 -2019
-531160...

output:

250853956.0239689052

result:

ok found '250853956.0239689', expected '250853956.0239689', error '0.0000000'

Test #23:

score: 30
Accepted
time: 9ms
memory: 4368kb

input:

30000
0 0
-20075 -15
-53286 -46
-77410 -74
-104765 -117
-128452 -158
-138117 -176
-145933 -192
-169668 -264
-195119 -349
-220533 -437
-227177 -463
-259461 -594
-288461 -712
-304625 -788
-337671 -947
-358291 -1056
-388248 -1227
-411605 -1362
-422810 -1433
-444967 -1583
-464234 -1714
-471059 -1763
-48...

output:

250990461.7585058212

result:

ok found '250990461.7585058', expected '250990461.7585058', error '0.0000000'

Test #24:

score: 30
Accepted
time: 9ms
memory: 4408kb

input:

30000
0 0
-25406 -9
-53669 -24
-62096 -33
-84905 -59
-97980 -83
-118490 -127
-139980 -180
-168464 -256
-187325 -315
-208655 -393
-215588 -421
-244663 -541
-261958 -614
-288250 -735
-294235 -765
-308563 -838
-338619 -993
-350477 -1059
-363699 -1134
-379676 -1232
-398726 -1354
-430095 -1576
-459666 -1...

output:

253698546.2001740336

result:

ok found '253698546.2001740', expected '253698546.2001740', error '0.0000000'

Test #25:

score: 30
Accepted
time: 9ms
memory: 4264kb

input:

30000
0 0
-21134 -9
-45635 -23
-62583 -36
-90936 -72
-123048 -113
-148384 -151
-173729 -190
-194644 -225
-207752 -258
-236495 -342
-241543 -359
-272810 -476
-303141 -602
-324057 -690
-344614 -778
-364773 -871
-380490 -948
-407975 -1083
-433651 -1212
-464879 -1383
-485067 -1502
-513615 -1674
-537857 ...

output:

249331713.2810479105

result:

ok found '249331713.2810479', expected '249331713.2810479', error '0.0000000'

Test #26:

score: 30
Accepted
time: 9ms
memory: 4272kb

input:

30000
0 0
-21448 -2
-26656 -6
-55814 -36
-82967 -67
-107428 -97
-134427 -133
-152614 -158
-171092 -185
-199260 -236
-221094 -282
-254022 -354
-285389 -431
-318637 -513
-346959 -588
-371288 -663
-398215 -753
-430925 -909
-460659 -1052
-492385 -1212
-522834 -1369
-544343 -1480
-574493 -1645
-591923 -1...

output:

252099986.1016024053

result:

ok found '252099986.1016024', expected '252099986.1016024', error '0.0000000'

Test #27:

score: 30
Accepted
time: 9ms
memory: 4268kb

input:

30000
0 0
-14622 -3
-21004 -5
-52082 -23
-74883 -43
-96336 -71
-128458 -113
-156799 -154
-183046 -195
-192091 -210
-222978 -268
-242938 -309
-262594 -352
-278459 -388
-305011 -451
-334920 -535
-359764 -614
-386317 -705
-387178 -708
-403823 -768
-433061 -876
-462803 -990
-476883 -1056
-501388 -1177
-...

output:

252058372.1872791648

result:

ok found '252058372.1872792', expected '252058372.1872792', error '0.0000000'

Test #28:

score: 30
Accepted
time: 9ms
memory: 4384kb

input:

30000
0 0
-25620 -6
-58948 -27
-81188 -42
-108084 -65
-116725 -73
-125232 -81
-135235 -91
-151536 -109
-184450 -152
-207622 -186
-226702 -226
-253157 -296
-272563 -363
-285333 -416
-314647 -544
-343300 -671
-374313 -814
-396287 -921
-420576 -1040
-429098 -1083
-461737 -1259
-484471 -1384
-514561 -15...

output:

250472754.0190104544

result:

ok found '250472754.0190105', expected '250472754.0190105', error '0.0000000'

Test #29:

score: 30
Accepted
time: 9ms
memory: 4304kb

input:

30000
0 0
-33296 -14
-53478 -25
-77571 -40
-102204 -60
-131127 -87
-154300 -115
-164094 -129
-170807 -139
-182721 -162
-204059 -213
-233651 -291
-248862 -344
-272501 -427
-292422 -497
-316393 -587
-332926 -655
-357527 -758
-377377 -846
-400755 -952
-421907 -1051
-432483 -1106
-463837 -1277
-484678 -...

output:

250911365.3928250968

result:

ok found '250911365.3928251', expected '250911365.3928251', error '0.0000000'

Test #30:

score: 30
Accepted
time: 6ms
memory: 4412kb

input:

30000
0 0
-16184 -12
-47000 -41
-65809 -62
-97992 -98
-130432 -136
-141298 -155
-166593 -204
-199502 -297
-227146 -379
-253391 -469
-268774 -523
-296503 -636
-323982 -757
-356038 -900
-373220 -977
-398856 -1098
-425367 -1243
-452654 -1396
-476703 -1537
-489569 -1615
-493812 -1641
-521509 -1812
-5419...

output:

250844611.9027090669

result:

ok found '250844611.9027091', expected '250844611.9027091', error '0.0000000'

Test #31:

score: 30
Accepted
time: 9ms
memory: 4364kb

input:

30000
0 0
-25799 -4
-55851 -26
-80970 -45
-101274 -62
-132285 -92
-156585 -119
-172335 -137
-194967 -166
-207127 -182
-210322 -187
-232931 -224
-254065 -285
-276296 -355
-296092 -422
-319568 -506
-341162 -585
-366961 -682
-378425 -726
-406880 -836
-433997 -944
-462505 -1063
-484234 -1155
-510379 -12...

output:

252561817.9649026096

result:

ok found '252561817.9649026', expected '252561817.9649026', error '0.0000000'

Test #32:

score: 30
Accepted
time: 6ms
memory: 4268kb

input:

30000
0 0
-26056 -4
-54769 -14
-60303 -16
-87623 -57
-116864 -112
-138854 -159
-157862 -208
-175152 -264
-200884 -367
-230497 -499
-252728 -608
-270362 -698
-296046 -842
-305774 -898
-310136 -925
-332152 -1067
-333986 -1079
-355425 -1222
-364727 -1286
-382658 -1414
-392920 -1492
-425026 -1737
-44041...

output:

253995087.9124097824

result:

ok found '253995087.9124098', expected '253995087.9124098', error '0.0000000'

Test #33:

score: 30
Accepted
time: 9ms
memory: 4272kb

input:

30000
0 0
-9535 -2
-40752 -11
-60579 -26
-93471 -57
-118567 -94
-144069 -132
-173022 -182
-195295 -224
-223889 -296
-247193 -355
-264085 -399
-290833 -470
-296735 -486
-316658 -542
-335761 -609
-366899 -722
-382069 -779
-411737 -894
-434702 -985
-457466 -1078
-487157 -1201
-497974 -1248
-524864 -136...

output:

252472448.5275533199

result:

ok found '252472448.5275533', expected '252472448.5275533', error '0.0000000'

Test #34:

score: 30
Accepted
time: 6ms
memory: 4304kb

input:

30000
0 0
-24944 -5
-45218 -18
-63052 -30
-95222 -53
-122297 -76
-142451 -95
-166142 -128
-198625 -176
-224888 -226
-256971 -297
-268524 -323
-295294 -399
-316093 -462
-346071 -556
-357361 -596
-384063 -695
-413239 -808
-431516 -883
-455899 -988
-477258 -1083
-482936 -1109
-514885 -1259
-545203 -140...

output:

251091289.9211815596

result:

ok found '251091289.9211816', expected '251091289.9211816', error '0.0000000'

Test #35:

score: 30
Accepted
time: 9ms
memory: 4308kb

input:

30000
0 0
-30995 -2
-54625 -11
-82116 -24
-107137 -37
-118814 -46
-145376 -68
-153252 -80
-185690 -144
-216437 -215
-233722 -272
-253995 -343
-271631 -413
-292398 -507
-321561 -641
-349834 -782
-373847 -909
-394268 -1020
-413992 -1130
-437644 -1265
-455088 -1371
-479307 -1520
-487919 -1573
-510069 -...

output:

252314719.9735080898

result:

ok found '252314719.9735081', expected '252314719.9735081', error '0.0000000'

Test #36:

score: 30
Accepted
time: 6ms
memory: 4364kb

input:

30000
0 0
-27620 -15
-32869 -18
-63930 -40
-92226 -71
-117410 -103
-128286 -121
-160858 -177
-175636 -204
-202913 -255
-210245 -270
-231489 -321
-239502 -341
-270542 -438
-300109 -534
-328778 -641
-347216 -724
-378021 -873
-405203 -1017
-433216 -1174
-466343 -1375
-485498 -1495
-512206 -1683
-537113...

output:

252132224.5177777708

result:

ok found '252132224.5177778', expected '252132224.5177778', error '0.0000000'

Test #37:

score: 30
Accepted
time: 9ms
memory: 4308kb

input:

30000
0 0
-26512 -10
-51854 -27
-59926 -34
-72478 -45
-104402 -85
-134454 -126
-156279 -156
-187348 -202
-204100 -236
-236516 -302
-257885 -347
-283292 -401
-304536 -460
-329866 -533
-362401 -630
-368232 -649
-393217 -739
-412750 -810
-443034 -922
-470338 -1029
-481188 -1073
-497958 -1151
-530836 -1...

output:

251728991.7551814914

result:

ok found '251728991.7551815', expected '251728991.7551815', error '0.0000000'

Test #38:

score: 30
Accepted
time: 9ms
memory: 4272kb

input:

30000
0 0
-29212 -4
-38598 -7
-71599 -25
-95384 -48
-122534 -75
-152884 -108
-185395 -148
-193339 -166
-211296 -218
-242492 -319
-262879 -390
-280381 -452
-297193 -522
-316047 -608
-344702 -748
-362716 -837
-371851 -884
-392232 -990
-415911 -1120
-428530 -1190
-455344 -1346
-476289 -1469
-502141 -16...

output:

252836476.4363638759

result:

ok found '252836476.4363639', expected '252836476.4363639', error '0.0000000'

Test #39:

score: 30
Accepted
time: 9ms
memory: 4368kb

input:

30000
0 0
-32998 -8
-60868 -23
-90627 -40
-119903 -65
-145529 -87
-161760 -103
-169947 -115
-194965 -153
-217424 -191
-240218 -232
-262746 -278
-274663 -306
-300259 -367
-311698 -396
-338898 -472
-371940 -583
-391272 -648
-422137 -773
-450678 -889
-472143 -979
-498399 -1098
-530708 -1249
-553762 -13...

output:

254810274.4235500395

result:

ok found '254810274.4235500', expected '254810274.4235500', error '0.0000000'

Test #40:

score: 30
Accepted
time: 9ms
memory: 4324kb

input:

30000
0 0
-8940 -5
-33085 -27
-59867 -53
-86492 -79
-109768 -109
-130705 -139
-137599 -149
-167036 -193
-175992 -209
-205088 -262
-231732 -316
-253027 -361
-277001 -412
-306909 -477
-319514 -507
-337756 -557
-357495 -615
-372846 -661
-389281 -720
-409556 -800
-431984 -897
-439453 -931
-470069 -1095
...

output:

252714495.2776288390

result:

ok found '252714495.2776288', expected '252714495.2776289', error '0.0000000'

Subtask #3:

score: 60
Accepted

Dependency #1:

100%
Accepted

Dependency #2:

100%
Accepted

Test #41:

score: 60
Accepted
time: 126ms
memory: 19020kb

input:

500000
0 0
-1984 -1
-3948 -2
-5906 -3
-7858 -4
-9782 -5
-11687 -6
-13584 -7
-15396 -8
-17164 -9
-18920 -10
-20662 -11
-22403 -12
-24141 -13
-25841 -14
-27533 -15
-29130 -16
-30717 -17
-32294 -18
-33869 -19
-35416 -20
-36958 -21
-38470 -22
-39949 -23
-41422 -24
-42890 -25
-44343 -26
-45731 -27
-47089...

output:

250546651.9010666609

result:

ok found '250546651.9010667', expected '250546651.9010667', error '0.0000000'

Test #42:

score: 60
Accepted
time: 131ms
memory: 18968kb

input:

500000
0 0
-1966 -1
-3887 -2
-5788 -3
-7676 -4
-9407 -5
-11076 -6
-12731 -7
-14285 -8
-15829 -9
-17361 -10
-18869 -11
-20358 -12
-21841 -13
-23323 -14
-24788 -15
-26134 -16
-27457 -17
-28627 -18
-29768 -19
-30831 -20
-31881 -21
-32923 -22
-33956 -23
-34977 -24
-36961 -26
-37931 -27
-39798 -29
-40731...

output:

250435395.8838684261

result:

ok found '250435395.8838684', expected '250435395.8838684', error '0.0000000'

Test #43:

score: 60
Accepted
time: 137ms
memory: 18984kb

input:

500000
0 0
-1951 -1
-3898 -2
-5828 -3
-7755 -4
-9668 -5
-11540 -6
-13405 -7
-15238 -8
-17036 -9
-18696 -10
-20310 -11
-21918 -12
-23504 -13
-25087 -14
-26643 -15
-28191 -16
-29738 -17
-31216 -18
-32637 -19
-34040 -20
-35437 -21
-36800 -22
-38134 -23
-39411 -24
-40685 -25
-41952 -26
-43163 -27
-44372...

output:

250864379.7991594076

result:

ok found '250864379.7991594', expected '250864379.7991594', error '0.0000000'

Test #44:

score: 60
Accepted
time: 137ms
memory: 19032kb

input:

500000
0 0
-1966 -1
-3814 -2
-5658 -3
-7499 -4
-9288 -5
-10993 -6
-12683 -7
-14368 -8
-16001 -9
-17554 -10
-19098 -11
-20624 -12
-22046 -13
-23375 -14
-24684 -15
-25923 -16
-27157 -17
-28373 -18
-29570 -19
-30755 -20
-31940 -21
-33061 -22
-34101 -23
-36091 -25
-37085 -26
-39050 -28
-41010 -30
-42924...

output:

250490528.3016454279

result:

ok found '250490528.3016454', expected '250490528.3016454', error '0.0000000'

Test #45:

score: 60
Accepted
time: 137ms
memory: 19028kb

input:

500000
0 0
-2000 -1
-3991 -2
-5959 -3
-7812 -4
-9659 -5
-11486 -6
-13244 -7
-14965 -8
-16685 -9
-18403 -10
-20112 -11
-21769 -12
-23425 -13
-25049 -14
-26661 -15
-28245 -16
-29805 -17
-31321 -18
-32778 -19
-34227 -20
-35648 -21
-37063 -22
-38451 -23
-39834 -24
-41189 -25
-42537 -26
-43862 -27
-45146...

output:

250484765.8163518906

result:

ok found '250484765.8163519', expected '250484765.8163519', error '0.0000000'

Test #46:

score: 60
Accepted
time: 130ms
memory: 18912kb

input:

500000
0 0
-1999 -1
-3969 -2
-5883 -3
-7768 -4
-9646 -5
-11522 -6
-13386 -7
-15249 -8
-17083 -9
-18886 -10
-20620 -11
-22334 -12
-24010 -13
-25682 -14
-27345 -15
-28999 -16
-30653 -17
-32305 -18
-33880 -19
-35447 -20
-36987 -21
-38504 -22
-39992 -23
-41471 -24
-42894 -25
-44296 -26
-45677 -27
-47055...

output:

250230916.1903697848

result:

ok found '250230916.1903698', expected '250230916.1903698', error '0.0000000'

Test #47:

score: 60
Accepted
time: 133ms
memory: 18944kb

input:

500000
0 0
-1957 -1
-3908 -2
-5811 -3
-7704 -4
-9571 -5
-11424 -6
-13257 -7
-15084 -8
-16829 -9
-18554 -10
-20227 -11
-21839 -12
-23449 -13
-25057 -14
-26543 -15
-28022 -16
-29490 -17
-30930 -18
-32353 -19
-33776 -20
-35142 -21
-36453 -22
-37757 -23
-39042 -24
-40309 -25
-41564 -26
-42760 -27
-43906...

output:

251523690.4624040425

result:

ok found '251523690.4624040', expected '251523690.4624040', error '0.0000000'

Test #48:

score: 60
Accepted
time: 138ms
memory: 18872kb

input:

500000
0 0
-1955 -1
-3908 -2
-5832 -3
-7723 -4
-9572 -5
-11411 -6
-13149 -7
-14815 -8
-16416 -9
-18007 -10
-19594 -11
-21168 -12
-22677 -13
-24178 -14
-25679 -15
-27176 -16
-28658 -17
-30129 -18
-31590 -19
-33032 -20
-34442 -21
-35816 -22
-37044 -23
-38207 -24
-39344 -25
-40420 -26
-41421 -27
-43334...

output:

251183725.5046660304

result:

ok found '251183725.5046660', expected '251183725.5046660', error '0.0000000'

Test #49:

score: 60
Accepted
time: 132ms
memory: 19000kb

input:

500000
0 0
-1997 -1
-3931 -2
-5858 -3
-7761 -4
-9578 -5
-11389 -6
-13134 -7
-14876 -8
-16612 -9
-18328 -10
-19994 -11
-21530 -12
-23041 -13
-24493 -14
-25929 -15
-27352 -16
-28721 -17
-30062 -18
-31354 -19
-32639 -20
-33919 -21
-35198 -22
-36458 -23
-37669 -24
-38874 -25
-40072 -26
-41248 -27
-42388...

output:

250578576.6313597560

result:

ok found '250578576.6313598', expected '250578576.6313598', error '0.0000000'

Test #50:

score: 60
Accepted
time: 133ms
memory: 18948kb

input:

500000
0 0
-1945 -1
-3846 -2
-5639 -3
-7414 -4
-9185 -5
-10917 -6
-12609 -7
-14296 -8
-15973 -9
-17613 -10
-19227 -11
-20729 -12
-22204 -13
-23675 -14
-25145 -15
-26563 -16
-27980 -17
-29273 -18
-30544 -19
-31789 -20
-33034 -21
-34257 -22
-35442 -23
-36592 -24
-37740 -25
-38877 -26
-39955 -27
-41029...

output:

250877196.0392704904

result:

ok found '250877196.0392705', expected '250877196.0392705', error '0.0000000'

Extra Test:

score: -3
Extra Test Failed : Time Limit Exceeded on 1

input:

3
1 1
2 2
3 3

output:


result: