QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#327495#6599. The Grand Tournamentlmf_upAC ✓191ms4168kbC++2029.9kb2024-02-15 02:58:572024-02-15 02:58:57

Judging History

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

  • [2024-02-15 02:58:57]
  • 评测
  • 测评结果:AC
  • 用时:191ms
  • 内存:4168kb
  • [2024-02-15 02:58:57]
  • 提交

answer

#include<bits/stdc++.h>

#define cp const point &
#define cl const line &
#define cc const circle &
#define LD long double
std::mt19937 rnd(time(0));
const LD eps = 1e-12;
const LD pi = std::numbers::pi;
const LD INF = 1e9;

int sgn(LD x)
{
    return x > eps ? 1 : (x < -eps ? -1 : 0);
}

LD sqr(LD x)
{ return x * x; }

struct point
{
    LD x, y;

    point operator+(cp a) const
    { return {x + a.x, y + a.y}; }

    point operator-(cp a) const
    { return {x - a.x, y - a.y}; }

    point operator*(LD t) const
    { return {x * t, y * t}; }

    point operator/(LD t) const
    { return {x / t, y / t}; }

    point rot(LD t) const
    { return {(LD) (x * cos(t) - y * sin(t)), (LD) (x * sin(t) + y * cos(t))}; }

    point rot90() const
    { return {-y, x}; }

    LD len2() const
    { return x * x + y * y; }

    LD len() const
    { return sqrtl(x * x + y * y); }

    point unit() const
    {
        LD d = len();
        return {(LD) (x / d), (LD) (y / d)};
    }

    int on_up()//b不判(0,0)
    {
        return sgn(y) == 1 || (sgn(y) == 0 && sgn(x) <0);
    }

    void print()
    {
        std::cout << x << ' ' << y << std::endl;
    }

    void read()
    {
        int xx, yy;
        std::cin >> xx >> yy;
        x = xx, y = yy;
    }

    friend bool operator<(cp a, cp b)
    {
        return a.x == b.x ? a.y < b.y : a.x < b.x;
    }

    friend bool operator>(cp a, cp b)
    {
        return a.x == b.x ? a.y > b.y : a.x > b.x;
    }
};

LD dot(cp a, cp b);

bool operator==(cp a, cp b)
{
    return !sgn(dot(a - b, a - b));
//    return !sgn(a.x-b.x)&&!(a.y-b.y);看题目
}

LD dis(cp a, cp b)//两点距离
{
    return sqrtl(sqr(a.x - b.x) + sqr(a.y - b.y));
}

LD dot(cp a, cp b)//点乘
{
    return a.x * b.x + a.y * b.y;
}

LD det(cp a, cp b)//叉乘
{
    return a.x * b.y - b.x * a.y;
}

bool turn_left(cp a, cp b, cp c)//判断ba是否逆时针转少于180°到ca
{
    return sgn(det(b - a, c - a)) > 0;//大于是严格凸包
}

struct line
{
    point s, t;

    line()
    {}

    line(point a, point b) : s(a), t(b)
    {}

    void read()
    {
        s.read(), t.read();
    }

    void print()
    {
        s.print(), std::cout << ' ', t.print();
    }

};

struct circle
{
    point c;
    LD r;

    circle()
    {}

    circle(point C, LD R)
    { c = C, r = R; }
};

bool in_circle(cp a, cc b)
{
    return sgn((b.c - a).len() - b.r) <= 0;
}

circle make_circle(point u, point v)
{
    point p = (u + v) / 2;
    return circle(p, (u - p).len());
}

circle make_circle(cp a, cp b, cp c)
{
    point p = b - a, q = c - a;
    point s(dot(p, p) / 2, dot(q, q) / 2);
    LD d = det(p, q);
    p = point(det(s, point(p.y, q.y)), det(point(p.x, q.x), s)) / d;
    return circle(a + p, p.len());
}

circle min_circle(std::vector<point> p)
{
    circle ret(p[0], 0);
    std::shuffle(p.begin(), p.end(), rnd);
    int len = p.size();
    for (int i = 0; i < len; i++)
        if (!in_circle(p[i], ret))
        {
            ret = circle(p[i], 0);
            for (int j = 0; j < i; j++)
                if (!in_circle(p[j], ret))
                {
                    ret = make_circle(p[j], p[i]);
                    for (int k = 0; k < j; ++k)
                        if (!in_circle(p[k], ret))
                            ret = make_circle(p[i], p[j], p[k]);
                }
        }
    return ret;
}

LD get_rad(point a, point b)
{
    if (a == point(0, 0) || b == point(0, 0))
        return 0;
    else
    {
        return acosl(dot(a, b) / (a.len() * b.len()));
    }
}

bool same_dir(cl a, cl b)//判断方向是否一致
{
    return sgn(det(b.t - b.s, a.t - a.s)) == 0 && sgn(dot(b.t - b.s, a.t - a.s)) > 0;
}

bool point_on_line(cp a, cl l)//判断点是否在直线上
{
    return sgn(det(a - l.s, l.t - l.s)) == 0;
}

bool point_on_segment(cp a, cl l)//判断点是否在线段上
{
    return point_on_line(a, l) && sgn(dot(l.s - a, l.t - a)) <= 0;//(<=代表可以端点
}

bool two_side(cp a, cp b, cl c)//判断两个点是否在线段的两边
{
    return sgn(det(a - c.s, c.t - c.s)) * sgn(det(b - c.s, c.t - c.s)) < 0;
}

bool intersect_judge_strict(cl a, cl b)
{
    return two_side(a.s, a.t, b) && two_side(b.s, b.t, a);
}

bool intersect_judge(cl a, cl b)
{//判断两个线段是否相交
    if (point_on_segment(a.s, b) || point_on_segment(a.t, b) || point_on_segment(b.s, a) ||
        point_on_segment(b.t, a))
        return true;
    return intersect_judge_strict(a, b);
}


point line_intersect(cl a, cl b)
{//得到两线段的交点
    LD s1 = det(a.t - a.s, b.s - a.s);
    LD s2 = det(a.t - a.s, b.t - a.s);
    return (b.s * s2 - b.t * s1) / (s2 - s1);
}

bool point_on_ray(cp a, cl b)
{//判断点是否在射线上
    return sgn(det(a - b.s, b.t - b.s)) == 0 && sgn(dot(a - b.s, b.t - b.s)) >= 0;
}

bool ray_intersect_judge(line a, line b)//判断两射线是否相交
{
    LD s1, s2;
    s1 = det(a.t - a.s, b.s - a.s);
    s2 = det(a.t - a.s, b.t - a.s);
    if (sgn(s1) == 0 && sgn(s2) == 0)
        return sgn(dot(a.t - a.s, b.s - a.s)) >= 0 || sgn(dot(b.t - b.s, a.s - b.s));
    if (!sgn(s1 - s2) || sgn(s1) == sgn(s2 - s1))return 0;
    std::swap(a, b);
    s1 = det(a.t - a.s, b.s - a.s);
    s2 = det(a.t - a.s, b.t - a.s);
    return sgn(s1) != sgn(s2 - s1);
}

LD point_to_line(cp a, cl b)
{//点到直线的距离
    return abs(det(b.t - b.s, a - b.s)) / dis(b.s, b.t);
}

point project_to_line(cp a, cl b)
{//得到点在线上的投影
    return b.s + (b.t - b.s) * (dot(a - b.s, b.t - b.s) / (b.t - b.s).len2());
}

LD point_to_segment(cp a, cl b)
{//点到线段的距离
    if (b.s == b.t)
        return dis(a, b.s);
    if (sgn(dot(b.s - a, b.t - b.s)) * sgn(dot(b.t - a, b.t - b.s)) <= 0)
        return abs(det(b.t - b.s, a - b.s)) / dis(b.s, b.t);
    return std::min(dis(a, b.s), dis(a, b.t));
}

std::vector<point> line_circle_intersect(cl a, cc b)//线与圆的交点
{//返回线与圆的交点
    if (sgn(point_to_segment(b.c, a) - b.r) > 0)
        return std::vector<point>();
    LD x = sqrtl(sqr(b.r) - sqr(point_to_line(b.c, a)));
    return std::vector<point>(
            {project_to_line(b.c, a) + (a.s - a.t).unit() * x, project_to_line(b.c, a) - (a.s - a.t).unit() * x});
}

LD circle_intersect_area(cc a, cc b)//求两个圆相交区域的面积
{
    LD d = dis(a.c, b.c);
    if (sgn(d - (a.r + b.r)) >= 0)return 0;
    if (sgn(d - abs(a.r - b.r)) <= 0)
    {
        LD r = std::min(a.r, b.r);
        return r * r * pi;
    }
    LD x = (d * d + a.r * a.r - b.r * b.r) / (2 * d),
            t1 = acosl(std::min((LD) 1, std::max((LD) -1, x / a.r))),
            t2 = acosl(std::min((LD) 1, std::max((LD) -1, (d - x) / b.r)));
    return sqr(a.r) * t1 + sqr(b.r) * t2 - d * a.r * sinl(t1);
}

std::vector<point> circle_intersect(cc a, cc b)//求两个圆的交
{
    if (a.c == b.c || sgn(dis(a.c, b.c) - a.r - b.r) > 0 || sgn(dis(a.c, b.c) - abs(a.r - b.r)) < 0)
        return {};
    point r = (b.c - a.c).unit();
    LD d = dis(a.c, b.c);
    LD x = ((sqr(a.r) - sqr(b.r)) / d + d) / 2;
    LD h = sqrtl(sqr(a.r) - sqr(x));
    if (sgn(h) == 0)return {a.c + r * x};
    return {a.c + r * x + r.rot90() * h, a.c + r * x - r.rot90() * h};
}

std::vector<point> tangent(cp a, cc b)//求一个点关于圆的切线
{
    circle p = make_circle(a, b.c);
    return circle_intersect(p, b);
}

std::vector<line> extangent(cc a, cc b)//求两圆的外切线
{
    std::vector<line> ret;
    if (sgn(dis(a.c, b.c) - abs(a.r - b.r)) <= 0)return ret;
    if (sgn(a.r - b.r) == 0)
    {
        point dir = b.c - a.c;
        dir = (dir * a.r / dir.len()).rot90();
        ret.push_back(line(a.c + dir, b.c + dir));
        ret.push_back(line(a.c - dir, b.c - dir));
    }
    else
    {
        point p = (b.c * a.r - a.c * b.r) / (a.r - b.r);
        std::vector pp = tangent(p, a), qq = tangent(p, b);
        if (pp.size() == 2 && qq.size() == 2)
        {
            if (sgn(a.r - b.r) < 0)
                std::swap(pp[0], pp[1]), std::swap(qq[0], qq[1]);
            ret.push_back(line(pp[0], qq[0]));
            ret.push_back(line(pp[1], qq[1]));
        }
    }
    return ret;
}

std::vector<line> intangent(cc a, cc b)//求两圆的内切线
{
    std::vector<line> ret;
    point p = (b.c * a.r + a.c * b.r) / (a.r + b.r);
    std::vector pp = tangent(p, a), qq = tangent(p, b);
    if (pp.size() == 2 && qq.size() == 2)
    {
        ret.push_back(line(pp[0], qq[0]));
        ret.push_back(line(pp[1], qq[1]));
    }
    return ret;
}

std::vector<point> cut(const std::vector<point> &c, line p)
{
    std::vector<point> ret;
    if (c.empty())return ret;
    int len = c.size();
    for (int i = 0; i < len; i++)
    {
        int j = (i + 1) % len;
        if (turn_left(p.s, p.t, c[i]))ret.push_back(c[i]);
        if (two_side(c[i], c[j], p))
            ret.push_back(line_intersect(p, line(c[i], c[j])));
    }
    return ret;
}

std::vector<point> convex_hull(std::vector<point> a)
{//凸包,字典序
    int n = (int) a.size(), cnt = 0;
    if (n < 2) return a;
    std::sort(a.begin(), a.end()); // less<pair>
    std::vector<point> ret;
    for (int i = 0; i < n; ++i)
    {
        while (cnt > 1
               && !turn_left(ret[cnt - 1], a[i], ret[cnt - 2]))
            --cnt, ret.pop_back();
        ++cnt, ret.push_back(a[i]);
    }
    int fixed = cnt;
    for (int i = n - 2; i >= 0; --i)
    {
        while (cnt > fixed
               && !turn_left(ret[cnt - 1], a[i], ret[cnt - 2]))
            --cnt, ret.pop_back();
        ++cnt, ret.push_back(a[i]);
    }
    ret.pop_back();
    return ret;
}

std::vector<point> minkovski(std::vector<std::vector<point>> a)
{
    if (a[0].size() == 1)
        return a[1];
    if (a[1].size() == 1)
        return a[0];
    for (int i = 0; i < 2; i++)a[i].push_back(a[i].front());
    int i[2] = {0, 0}, len[2] = {(int) a[0].size() - 1, (int) a[1].size() - 1};
    std::vector<point> ret;
    ret.push_back(a[0][0] + a[1][0]);
    do
    {
        int d = sgn(det(a[1][i[1] + 1] - a[1][i[1]], a[0][i[0] + 1] - a[0][i[0]])) >= 0;
        ret.push_back(a[d][i[d] + 1] - a[d][i[d]] + ret.back());
        i[d] = (i[d] + 1) % len[d];
    }
    while (i[0] || i[1]);
    return ret;
}

struct Convex
{
    int n;
    std::vector<point> a, upper, lower;
    std::map<point, int> mp;

    Convex(std::vector<point> _a) : a(_a)
    {
        n = a.size();
        int k = 0;
        for (int i = 1; i < n; i++)if (a[k] < a[i])k = i;
        for (int i = 0; i <= k; i++) lower.push_back(a[i]);
        for (int i = k; i < n; i++) upper.push_back(a[i]);
        upper.push_back(a[0]);
    }

    void pre_to_check_point()
    {
        for (int i = 0; i < n; i++)
            mp[a[i]] = i;
    }

    std::pair<LD, int> get_tan(std::vector<point> &con, point vec)
    {
        int l = 0, r = (int) con.size() - 2;
        for (; l + 1 < r;)
        {
            int mid = (l + r) / 2;
            if (sgn(det(con[mid + 1] - con[mid], vec)) > 0)r = mid;
            else l = mid;
        }
        return std::max(std::make_pair(det(vec, con[r]), r), std::make_pair(det(vec, con[0]), 0));
    }

    void upd_tan(cp p, int id, int &i0, int &i1)//辅助函数
    {
//        if (i0 == -1) i0 = id;
        if ((det(a[i0] - p, a[id] - p)) > 0) i0 = id;
//        if (i1 == -1) i1 = id;
        if ((det(a[i1] - p, a[id] - p)) < 0) i1 = id;
    }

    void search(int l, int r, point p, int &i0, int &i1)//辅助函数
    {
        if (l == r)return;
        upd_tan(p, l % n, i0, i1);
        int sl = sgn(det(a[l % n] - p, a[(l + 1) % n] - p));
        for (; l + 1 < r;)
        {
            int mid = (l + r) / 2;
            int smid = sgn(det(a[mid % n] - p, a[(mid + 1) % n] - p));
            if (smid == sl)l = mid;
            else r = mid;
        }
        upd_tan(p, r % n, i0, i1);
    }

    int search(point u, point v, int l, int r)//辅助函数
    {
        int sl = sgn(det(v - u, a[l % n] - u));
        for (; l + 1 < r;)
        {
            int mid = (l + r) / 2;
            int smid = sgn(det(v - u, a[mid % n] - u));
            if (smid == sl) l = mid;
            else r = mid;
        }
        return l % n;
    }

    //判定点是否在凸包内,在边界返回true
    bool contain(point p)
    {
        if (p.x < lower[0].x || p.x > lower.back().x)return false;
        int id = std::lower_bound(lower.begin(), lower.end(), point(p.x, -INF)) - lower.begin();
        if (lower[id].x == p.x)
        {
            if (lower[id].y > p.y)return false;
        }
        else if (det(lower[id - 1] - p, lower[id] - p) < 0)
            return false;
        id = std::lower_bound(upper.begin(), upper.end(), point(p.x, INF), std::greater<point>()) - upper.begin();
        if (upper[id].x == p.x)
        {
            if (upper[id].y < p.y)return false;
        }
        else if (det(upper[id - 1] - p, upper[id] - p) < 0)
            return false;
        return true;
    }

    int contain_strict(point p)//0代表在外面 1代表在里面 2代表在边上 3代表在点上
    {
        if (p.x < lower[0].x || p.x > lower.back().x)return 0;
        int id = std::lower_bound(lower.begin(), lower.end(), point(p.x, -INF)) - lower.begin();
        if (lower[id].x == p.x)
        {
            if (lower[id].y > p.y)return 0;
            else if (sgn(lower[id].y - p.y) == 0) return 3;
            else if (id + 1 < lower.size() && lower[id + 1].x == p.x && p.y < lower[id + 1].y)
                return 2;
            else if (id + 1 < lower.size() && lower[id + 1].x == p.x && p.y == lower[id + 1].y)
                return 3;
        }
        else if (det(lower[id - 1] - p, lower[id] - p) < 0)
            return 0;
        else if (sgn(det(lower[id - 1] - p, lower[id] - p)) == 0)
            return 2;
        id = std::lower_bound(upper.begin(), upper.end(), point(p.x, INF), std::greater<point>()) - upper.begin();
        if (upper[id].x == p.x)
        {
            if (upper[id].y < p.y)return 0;
            else if (upper[id].y == p.y)return 3;
            else if (id + 1 < upper.size() && upper[id + 1].x == p.x && p.y > upper[id + 1].y)
                return 2;
            else if (id + 1 < upper.size() && upper[id + 1].x == p.x && p.y == upper[id + 1].y)
                return 3;
        }
        else if (det(upper[id - 1] - p, upper[id] - p) < 0)
            return 0;
        else if (sgn(det(upper[id - 1] - p, upper[id] - p)) == 0)
            return 2;
        return 1;
    }

    bool get_tan(point p, int &i0, int &i1)
    {// 求点 p 关于凸包的两个切点, 如果在凸包外则有序返回编号, 共线的多个切点返回任意一个, 否则返回 false
        i0 = i1 = 0;
        int id = int(std::lower_bound(lower.begin(), lower.end(), p) - lower.begin());
        search(0, id, p, i0, i1);
        search(id, (int) lower.size(), p, i0, i1);
        id = int(std::lower_bound(upper.begin(), upper.end(), p, std::greater<point>()) - upper.begin());
        search((int) lower.size() - 1, (int) lower.size() - 1 + id, p, i0, i1);
        search((int) lower.size() - 1 + id, (int) lower.size() - 1 + (int) upper.size(), p, i0, i1);
        return true;
    }

    bool my_get_tan(point p, int &i0, int &i1)//自己魔改,常数大,可求点在凸包上的切线
    {
        if (p.x < lower[0].x || p.x > lower.back().x)
        {
            get_tan(p, i0, i1);
            return true;
        }
        int id = std::lower_bound(lower.begin(), lower.end(), point(p.x, -INF)) - lower.begin();
        if (lower[id].x == p.x)
        {
            if (lower[id].y > p.y)
            {
                get_tan(p, i0, i1);
                return true;
            }
            else if (sgn(lower[id].y - p.y) == 0)
            {
                i0 = (id - 1 + n) % n, i1 = (id + 1) % n;
                return true;
            }
            else if (id + 1 < lower.size() && lower[id + 1].x == p.x && p.y < lower[id + 1].y)
            {
                i0 = id, i1 = (id + 1) % n;
                return true;
            }
            else if (id + 1 < lower.size() && lower[id + 1].x == p.x && p.y == lower[id + 1].y)
            {
                i0 = id, i1 = (id + 2) % n;
                return true;
            }
        }
        else if (det(lower[id - 1] - p, lower[id] - p) < 0)
        {
            get_tan(p, i0, i1);
            return true;
        }
        else if (sgn(det(lower[id - 1] - p, lower[id] - p)) == 0)
        {
            i0 = (id - 1 + n) % n, i1 = id;
            return true;
        }
        id = std::lower_bound(upper.begin(), upper.end(), point(p.x, INF), std::greater<point>()) - upper.begin();
        if (upper[id].x == p.x)
        {
            if (upper[id].y < p.y)
            {
                get_tan(p, i0, i1);
                return true;
            }
            else if (upper[id].y == p.y)
            {
                i0 = id + lower.size() - 1;
                i1 = (i0 + 1 + n) % n;
                i0 = (i0 + n - 1) % n;
                return true;
            }
            else if (id + 1 < upper.size() && upper[id + 1].x == p.x && p.y > upper[id + 1].y)
            {
                i0 = id + lower.size() - 1;
                i1 = (i0 + 1) % n;
                i0 = (i0 + n) % n;
                return true;
            }
            else if (id + 1 < upper.size() && upper[id + 1].x == p.x && p.y == upper[id + 1].y)
            {
                i0 = n - 1, i1 = 1;
                return true;
            }
        }
        else if (det(upper[id - 1] - p, upper[id] - p) < 0)
        {
            get_tan(p, i0, i1);
            return true;
        }
        else if (sgn(det(upper[id - 1] - p, upper[id] - p)) == 0)
        {
            i0 = (id + lower.size() - 1 + n) % n;
            i1 = (i0 - 1 + n) % n;
            std::swap(i0, i1);
            return true;
        }
        return false;
    }

    // 求凸包上和向量 vec 叉积最大的点, 返回编号, 共线的多个切点返回任意一个
    int get_tan(point vec)
    {
        std::pair<LD, int> ret = get_tan(upper, vec);
        ret.second = (ret.second + (int) lower.size() - 1) % n;
        ret = std::max(ret, get_tan(lower, vec));
        return ret.second;
    }

    bool my_judge_intersect_segment(cp u, cp v)//判断线段与凸包是否有严格相交,即有无穿过内部,默认起点和终点不在凸包内部了
    {
        int u1, u2;
        my_get_tan(u, u1, u2);
        if (!turn_left(u, a[u2], v) || !turn_left(u, v, a[u1]))
            return false;
        my_get_tan(v, u1, u2);
        if (!turn_left(v, a[u2], u) || !turn_left(v, u, a[u1]))
            return false;
        return true;
    }
    // 求凸包和直线 u,v 的交点, 如果无严格相交返回 false. 如果有则是和 (i,next(i)) 的交点, 两个点无序, 交在点上不确定返回前后两条线段其中之一

    bool get_inter(point u, point v, int &i0, int &i1)
    {
        int p0 = get_tan(u - v), p1 = get_tan(v - u);
        if (sgn(det(v - u, a[p0] - u)) * sgn(det(v - u, a[p1] - u)) < 0)
        {
            if (p0 > p1)std::swap(p0, p1);
            i0 = search(u, v, p0, p1);
            i1 = search(u, v, p1, p0 + n);
            return true;
        }
        else return false;
    }
};

bool in_polygon(cp p, const std::vector<point> &po)//判断点是否在多边形里
{
    int n = (int) po.size();
    int cnt = 0;
    for (int i = 0; i < n; i++)
    {
        point a = po[i], b = po[(i + 1) % n];
        if (point_on_segment(p, line(a, b)))return true;
        int x = sgn(det(p - a, b - a)), y = sgn(a.y - p.y), z = sgn(b.y - p.y);
        if (x > 0 && y <= 0 && z > 0)++cnt;
        if (x < 0 && z <= 0 && y > 0)--cnt;

    }
    return cnt != 0;
}

bool In_Polygon(cp P, std::vector<point> &polygon)//判断点是否在多边形里面,射线法O(n)
{
    bool flag = false; //相当于计数
    point P1, P2; //多边形一条边的两个顶点
    int n = polygon.size();
    for (int i = 0, j = n - 1; i < n; j = i++)
    {
        //polygon[]是给出多边形的顶点
        P1 = polygon[i];
        P2 = polygon[j];
        if (point_on_segment(P, line(P1, P2)))return true;
        //前一个判断min(P1.y,P2.y)<P.y<=max(P1.y,P2.y)
        //这个判断代码我觉得写的很精妙 我网上看的 应该是大神模版
        //后一个判断被测点 在 射线与边交点 的左边
        if ((sgn(P1.y - P.y) > 0 != sgn(P2.y - P.y) > 0) &&
            sgn(P.x - (P.y - P1.y) * (P1.x - P2.x) / (P1.y - P2.y) - P1.x) < 0)
            flag = !flag;
    }
    return flag;
}

std::vector<point> Minkovski(std::vector<std::vector<point>> a)//可处理退化成线段的凸包
{                                                            //闵可夫斯基和
    std::vector<point> S;
    int n = a[0].size(), m = a[1].size();
    std::vector<point> A(n), B(m);
    for (int i = 0; i < n - 1; i++) A[i] = a[0][i + 1] - a[0][i];
    A[n - 1] = a[0][0] - a[0][n - 1];
    for (int i = 0; i < m - 1; i++) B[i] = a[1][i + 1] - a[1][i];
    B[m - 1] = a[1][0] - a[1][m - 1];                                                             //将两个凸包上的边向量都存入a,b中
    S.push_back(a[0][0] + a[1][0]);
    int p1 = 0, p2 = 0;
    while (p1 < n && p2 < m)
    {
        LD d = det(A[p1], B[p2]);
        if (d > 0)
            S.push_back(S.back() + A[p1++]);
        else if (d < 0)
            S.push_back(S.back() + B[p2++]);
        else
        {
            if (dot(A[p1], B[p1]) >= 0)
                S.push_back(S.back() + A[p1++]);
            else
            {
                auto [x, y] = A[p1];
                if (x > 0)
                    S.push_back(S.back() + A[p1++]);
                else if (x < 0)
                    S.push_back(S.back() + B[p2++]);
                else
                {
                    if (y > 0)
                        S.push_back(S.back() + A[p1++]);
                    else S.push_back(S.back() + B[p2++]);
                }
            }
        }
    }
    while (p1 < n)
        S.push_back(S.back() + A[p1++]);
    while (p2 < m)
        S.push_back(S.back() + B[p2++]);
    return S;
}

LD farthest_pair(std::vector<point> pu)//最远点对
{
    pu = convex_hull(pu);
    std::vector<std::vector<point>> ppu(2);
    std::vector<point> pu1;
    for (auto x: pu)
        pu1.push_back(x * -1);
    pu1 = convex_hull(pu1);
    ppu[0] = pu, ppu[1] = pu1;
    auto ret = Minkovski(ppu);
    LD ans = 0;
    for (auto x: ret)
        ans = std::max(ans, x.len());
    return ans;
}

LD closest_pair(std::vector<point> pu)//最近点对O(nlogn)
{
    int n = pu.size();
    std::sort(pu.begin(), pu.end());
    for (int i = 1; i < n; i++)
        if (pu[i] == pu[i - 1])
            return 0;
    std::set<point, decltype([](cp u, cp v)
    { return u.y == v.y ? u.x < v.x : u.y < v.y; })> s;
    LD ans = (pu[0] - pu[1]).len2();
    for (int i = 0, j = 0; i < n; i++)
    {
        if (ans == 0)
            break;
        auto it = s.begin();
        while (!s.empty() && j < i && sqr(pu[i].x - pu[j].x) >= ans)
            s.erase(pu[j++]);
        auto oit = s.lower_bound(pu[i]);
        it = oit;
        while (ans)
        {
            if (it == s.end())
                break;
            if (sqr(it->y - pu[i].y) >= ans)
                break;
            ans = std::min(ans, (pu[i] - *it).len2());
            it++;
        }
        it = oit;
        while (ans)
        {
            if (it == s.begin())
                break;
            it--;
            if (sqr(it->y - pu[i].y) >= ans)
                break;
            ans = std::min(ans, (pu[i] - *it).len2());
        }
        s.insert(pu[i]);
    }
    return sqrtl(ans);
}

void print(std::vector<point> res)
{
    std::cout << "print:\n";
    int cnt = 0;
    for (auto [x, y]: res)
        std::cout << ++cnt << ' ' << x << ' ' << y << std::endl;
    std::cout << "end\n";
}

int onRight(cl a,cp b){return det(a.t-a.s,b-a.s)<=-eps;}//如果要包含点就-eps,不要就eps
/*
 丢直线 Ax+By+C<0;
if(sgn(b)==0)
            pl.push_back(line(point(-c/a,0),point(-c/a-b,a)));
        else pl.push_back(line(point(0,-c/b),point(-b,-c/b+a)));
 * */

std::vector<point> my_half_plane(std::vector<line> a)
{
    /*要加框取消注释 请注意对于一组解(x,y)x和y是否有要求
    a.push_back({{-INF,-INF},{INF,-INF}});
    a.push_back({{INF,-INF},{INF,INF}});
    a.push_back({{INF,INF},{-INF,INF}});
    a.push_back({{-INF,INF},{-INF,-INF}});
     */
    std::sort(a.begin(),a.end(),[&](auto x,auto y)
    {
        point u = x.t - x.s, v = y.t - y.s;
        if (u.on_up() != v.on_up())return u.on_up() < v.on_up();
        if(sgn(det(u,v)))
        return sgn(det(u, v)) > 0;
        else return sgn(det(x.t-y.s,y.t-y.s))<0;
    });
    int n = a.size();
    std::vector<line> que(n + 1);
    std::vector<point> p1(n + 1);
    std::vector<point> p2;
    int left = 0, right = 0;
    que[0] = a[0];
    std::vector<point>sb;
    for (int i = 1; i < n; i++)
    {
        if(sgn(det(a[i].t-a[i].s,a[i-1].t-a[i-1].s))==0)
            continue;
        while (left < right && onRight(a[i],p1[right]))right--;
        while (left < right && onRight(a[i],p1[left+1]))left++;
        que[++right] = a[i];
        if (std::abs(det(que[right].t - que[right].s, que[right - 1].t - que[right - 1].s)) <= eps)
        {
            if (onRight(que[right],que[right-1].s) &&
                dot(que[right].t-que[right].s,que[right-1].t-que[right-1].s)<=-eps)
                return sb;
            right--;
            if (!onRight(que[right],a[i].s))
                que[right] = a[i];
        }
        if (left < right)p1[right] = line_intersect(que[right], que[right - 1]);
    }
    while (left < right && onRight(que[left],p1[right]))right--;
    if (right - left <= 1)return sb;
    p1[left] = line_intersect(que[left], que[right]);
    for (int i = left; i <= right; i++)
        p2.push_back(p1[i]);
    return p2;
}
/*
 丢直线 Ax+By+C<0;
if(sgn(b)==0)
            pl.push_back(line(point(-c/a,0),point(-c/a-b,a)));
        else pl.push_back(line(point(0,-c/b),point(-b,-c/b+a)));
 * */
LD get_are(std::vector<point>pu)
{
    LD ans=0;
    int n=pu.size();
    for(int i=0;i<n;i++)
        ans+=det(pu[i],pu[(i+1)%n]);
    return ans/2;
}
LD get_max_inscribed_circle(const std::vector<point>pu)
{
    int n=pu.size();
    std::vector<point>dt(n);
    for(int i=0;i<n;i++)
        dt[i]=((pu[(i+1)%n]-(pu[i]+pu[(i+1)%n])/2).rot90()).unit();
    LD l=0,r=1e7;
    std::function<bool(LD)>check=[&](LD r)
    {
        std::vector<line>pl;
        for(int i=0;i<n;i++)
            pl.push_back({pu[i]+dt[i]*r,pu[(i+1)%n]+dt[i]*r});
        auto po= my_half_plane(pl);
        return !po.empty();
    };
    while(r-l>1e-4)
    {
        LD mid=(r+l)/2;
        if(check(mid))
            l=mid;
        else r=mid;
    }
    return l;
}
void solve()
{
    point p1,p2;
    p1.read(),p2.read();
    line l1,l2;
    l1.read(),l2.read();
    if(!intersect_judge(l1,l2)|| intersect_judge_strict(l1,l2))
    {
        std::cout<<0<<std::endl;
        return ;
    }
    std::vector<line>pl;
    pl.push_back(line(p1,point(p2.x,p1.y)));
    pl.push_back(line(point(p2.x,p1.y),p2));
    pl.push_back(line(p2,point(p1.x,p2.y)));
    pl.push_back(line(point(p1.x,p2.y),p1));
    if(sgn(det(l1.t-l1.s,l2.t-l2.s))==0)
    {
        int flag=0;
        if(l1.s==l2.s)flag++;
        if(l1.s==l2.t)flag++;
        if(l1.t==l2.s)flag++;
        if(l1.t==l2.t)flag++;
        if((l1.t-l1.s).len()>(l2.t-l2.s).len())
            std::swap(l1,l2);
        if(l1.s>l1.t)
            std::swap(l1.s,l1.t);
        if(flag==0)
        {
            std::vector<point>pu;
            pu.push_back(l1.s);
            pu.push_back(l1.t);
            pu.push_back(l2.s);
            pu.push_back(l2.t);
            std::sort(pu.begin(),pu.end());
            l1.s=pu[1];
            l1.t=pu[2];
            pl.push_back(line(l1.s,l1.s+(l1.s-l1.t).rot90()));
            pl.push_back(line(l1.t,l1.t+(l1.t-l1.s).rot90()));
        }
        else if(flag==1)
        {
            if(point_on_segment(l1.s,l2)&& point_on_segment(l1.t,l2))
            {
                if(l1.s==l2.s||l1.s==l2.t)
                    pl.push_back(line(l1.t,l1.t+(l1.t-l1.s).rot90()));
                else pl.push_back(line(l1.s,l1.s+(l1.s-l1.t).rot90()));
            }
            else
            {
                std::cout<<0<<std::endl;
                return ;
            }
        }
        else
        {
            std::cout<<(p2.y-p1.y)*(p2.x-p1.x)<<std::endl;
            return ;
        }
    }
    else
    {
        if(l1.s!=l2.s&&l1.t!=l2.s&&l1.s!=l2.t&&l1.t!=l2.t)
        {
            std::cout<<0<<std::endl;
            return ;
        }
        point base;
        if(l1.s==l2.s||l1.s==l2.t)
            base=l1.s;
        else base=l1.t;
        std::vector<point>pu;
        if(l1.s!=base)pu.push_back(l1.s);
        if(l1.t!=base)pu.push_back(l1.t);
        if(l2.s!=base)pu.push_back(l2.s);
        if(l2.t!=base)pu.push_back(l2.t);
        if(sgn(det(pu[0]-base,pu[1]-base))<0)
            std::swap(pu[0],pu[1]);
        pl.push_back(line(base,base+(pu[1]-base).rot90()));
        pl.push_back(line(base+(base-pu[0]).rot90(),base));
    }
    std::cout<<get_are(my_half_plane(pl))<<std::endl;
}

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0), std::cout.tie(0);
    std::cout << std::fixed << std::setprecision(9);
    int T = 1;
    std::cin>>T;
    for (int i = 1; i <= T; i++)
        solve();
}

这程序好像有点Bug,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3872kb

input:

2
0 0 3 3
1 1 1 2
2 1 2 2
0 0 3 3
1 1 1 2
1 2 2 2

output:

0
1.000000000

result:

ok 2 numbers

Test #2:

score: 0
Accepted
time: 1ms
memory: 4156kb

input:

10
0 0 7 6
2 4 4 4
3 2 5 2
0 0 7 6
2 4 4 4
4 4 5 2
0 0 2 4
1 1 1 2
1 2 1 3
0 0 2 3
1 1 1 2
1 1 1 2
0 0 3 3
1 1 2 2
1 2 2 1
0 0 2 4
1 1 1 2
1 2 1 3
0 0 6 6
1 1 5 5
1 5 3 3
0 0 2 3
1 1 1 2
1 1 1 2
0 0 2 5
1 1 1 3
1 2 1 4
0 0 2 4
1 1 1 3
1 1 1 2

output:

0
3.750000000
0
6.000000000
0
0
0
6.000000000
2.000000000
4.000000000

result:

ok 10 numbers

Test #3:

score: 0
Accepted
time: 120ms
memory: 3972kb

input:

100000
350 720 355 732
353 725 352 729
354 721 353 725
-807 606 -801 621
-803 608 -803 616
-803 616 -803 614
-389 463 -373 466
-382 464 -387 464
-387 464 -385 464
-664 801 -655 806
-656 803 -659 803
-659 803 -657 802
896 -767 901 -762
900 -763 897 -763
900 -763 897 -763
403 645 407 652
406 647 405 6...

output:

0
42.000000000
12.000000000
24.000000000
25.000000000
28.000000000
99.000000000
0
135.000000000
6.000000000
42.000000000
45.000000000
120.000000000
8.000000000
84.000000000
15.000000000
16.000000000
0
36.000000000
4.000000000
0.500000000
20.000000000
1.000000000
0
36.000000000
50.000000000
5.6666666...

result:

ok 100000 numbers

Test #4:

score: 0
Accepted
time: 147ms
memory: 3928kb

input:

100000
-653 -979 -650 -961
-652 -973 -651 -973
-652 -973 -651 -973
-311 -975 -297 -966
-301 -967 -309 -973
-309 -973 -301 -967
734 -459 746 -420
736 -451 743 -440
736 -451 743 -440
127 431 139 456
131 436 138 447
138 447 131 436
-535 293 -505 299
-510 296 -531 297
-510 296 -533 295
571 -397 584 -371...

output:

54.000000000
126.000000000
468.000000000
300.000000000
29.590062112
190.666666667
75.000000000
0
323.000000000
0
0
18.000000000
0
141.289473684
29.307692308
21.000000000
7.750000000
20.000000000
3.100000000
144.000000000
1.583333333
0
0
30.000000000
49.000000000
341.422064777
28.000000000
0
6.000000...

result:

ok 100000 numbers

Test #5:

score: 0
Accepted
time: 159ms
memory: 4160kb

input:

100000
-553 286 -544 299
-551 297 -552 288
-551 297 -548 293
-535 81 -526 122
-534 86 -532 117
-532 117 -534 86
42 -110 54 -94
43 -95 47 -109
47 -109 45 -102
392 33 397 38
395 36 394 37
394 37 395 36
-934 910 -916 933
-924 915 -933 916
-917 921 -933 916
-119 -981 -87 -975
-90 -980 -114 -980
-103 -97...

output:

6.444444444
369.000000000
106.285714286
25.000000000
5.600000000
0
32.000000000
216.000000000
0
99.900000000
0
6.000000000
276.650000000
0
462.000000000
42.000000000
0
0
1710.000000000
0
50.000000000
245.000000000
720.000000000
18.000000000
0
0
0
57.000000000
120.000000000
5.400000000
0
297.00000000...

result:

ok 100000 numbers

Test #6:

score: 0
Accepted
time: 108ms
memory: 4168kb

input:

100000
587 345 644 380
643 368 595 358
643 368 595 358
361 362 367 379
362 373 364 368
364 368 366 363
-418 766 -374 819
-410 796 -403 813
-417 779 -403 813
-536 183 -488 322
-510 238 -521 222
-521 222 -532 304
719 393 812 421
728 417 808 420
728 417 808 420
209 -634 242 -618
231 -623 238 -626
238 -...

output:

1995.000000000
0
1265.647058824
1482.564786585
2604.000000000
528.000000000
384.000000000
481.630769231
0
490.000000000
70.000000000
0
16.000000000
270.000000000
597.454545455
288.000000000
0
1206.625000000
512.000000000
1.076388889
1458.000000000
0
2912.000000000
135.000000000
612.000000000
0
20.83...

result:

ok 100000 numbers

Test #7:

score: 0
Accepted
time: 176ms
memory: 4076kb

input:

100000
-77 35 -66 122
-69 98 -72 81
-72 81 -69 70
-804 257 -551 278
-656 269 -794 277
-656 269 -587 265
-311 610 -280 731
-306 638 -288 700
-306 638 -288 700
-438 472 -433 615
-437 536 -437 499
-437 499 -437 536
-295 -71 -213 39
-275 -29 -238 34
-275 -29 -238 34
589 387 728 432
646 394 631 407
616 4...

output:

5.614973262
0
3751.000000000
715.000000000
9020.000000000
0
14300.000000000
16364.274193548
50801.483870968
16.000000000
0
2493.636363636
280.660714286
44.000000000
185.000000000
935.000000000
9.465909091
56.000000000
4726.000000000
437.100000000
466.877557756
3038.000000000
37.916666667
656.0000000...

result:

ok 100000 numbers

Test #8:

score: 0
Accepted
time: 145ms
memory: 3944kb

input:

100000
-475 589 -253 919
-408 663 -351 817
-408 663 -351 817
524 632 561 857
553 829 556 729
541 765 559 807
-253 -540 -98 -505
-239 -506 -232 -510
-239 -506 -232 -510
-149 639 -51 649
-130 647 -87 644
-130 647 -87 644
719 -478 924 92
916 -66 920 74
910 -276 912 -206
-75 -924 -47 -677
-66 -844 -48 -...

output:

73260.000000000
0
5425.000000000
980.000000000
0
4692.470588235
651.000000000
560.000000000
21645.000000000
1013.246785058
32053.000000000
96819.000000000
31937.175589076
168.000000000
260.000000000
2398.378048780
8256.000000000
0
0
14500.301886792
0
3600.000000000
0
0
71273.000000000
1092.000000000...

result:

ok 100000 numbers

Test #9:

score: 0
Accepted
time: 155ms
memory: 3948kb

input:

100000
-302 -975 987 976
-25 289 396 -1
21 -703 930 -131
-993 -999 968 963
-381 -323 929 583
487 -43 -303 -356
-700 -827 301 846
-366 742 -570 319
-570 319 -638 178
401 -174 675 180
463 -149 455 -131
463 -149 459 -140
-133 -812 454 808
221 176 145 537
121 651 145 537
-334 -930 781 -18
638 -504 279 -...

output:

0
0
0
18936.444444444
0
1016880.000000000
602.170545874
509410.000000000
0
177747.808383234
240642.338709677
369120.778614458
0
538241.000000000
0
0
0
257258.782978723
339529.651578947
477372.244011976
1982880.000000000
197799.945920540
0
0
0
0
0
1793.285714286
1003657.000000000
845043.000000000
984...

result:

ok 100000 numbers

Test #10:

score: 0
Accepted
time: 143ms
memory: 4024kb

input:

100000
-979 -985 824 957
559 390 -209 191
313 140 -209 191
-803 -976 928 979
686 -661 -676 876
686 -661 -676 876
-930 -993 896 995
519 318 -16 230
-16 230 519 318
-625 -850 969 915
540 -88 575 572
526 -352 561 308
-840 -977 839 946
122 -658 -670 403
-670 403 122 -658
-994 -1000 951 1000
383 -468 211...

output:

1351762.309357040
3384105.000000000
3630088.000000000
632999.136363636
3228717.000000000
867642.888888889
0
3506074.000000000
3256160.000000000
3230766.000000000
3144390.000000000
3487424.000000000
0
0
2231056.000000000
3827620.000000000
2734851.414144441
0
2521680.000000000
3394460.000000000
0
913....

result:

ok 100000 numbers

Test #11:

score: 0
Accepted
time: 132ms
memory: 3928kb

input:

100000
-998 -998 997 994
-271 -892 885 154
501 -277 -539 313
-992 -993 977 998
-240 190 -155 863
107 43 -449 362
-992 -1000 996 1000
-498 586 530 -270
-813 478 787 -484
-999 -990 994 999
328 -701 -484 -425
328 -701 -484 -425
-998 -999 997 994
-559 439 929 299
185 369 929 299
-1000 -999 994 999
766 -...

output:

0
0
0
3964077.000000000
1687977.243279570
3984012.000000000
1186.807270149
3769116.000000000
3972033.000000000
2145411.934163701
0
2031273.563218391
769194.258547009
1829984.509090909
2233806.753209700
3958054.000000000
164249.713010204
205535.187740271
3948120.000000000
3952140.000000000
0
3847470....

result:

ok 100000 numbers

Test #12:

score: 0
Accepted
time: 135ms
memory: 3932kb

input:

100000
329 -90 334 -72
332 -89 332 -88
332 -89 332 -88
-211 427 -208 432
-209 428 -210 430
-209 428 -210 430
277 218 283 223
281 222 280 220
281 222 280 220
117 -745 128 -740
118 -744 127 -743
127 -743 118 -744
-438 172 -429 184
-437 177 -431 177
-431 176 -436 177
-406 529 -403 535
-405 530 -405 531...

output:

90.000000000
15.000000000
30.000000000
55.000000000
0
18.000000000
0.666666667
9.000000000
0
11.375000000
1.250000000
15.000000000
352.000000000
0
0
80.000000000
0
12.000000000
56.000000000
0
2.500000000
0
4.000000000
0
2.500000000
5.750000000
6.000000000
156.000000000
0
0
10.000000000
0
54.00000000...

result:

ok 100000 numbers

Test #13:

score: 0
Accepted
time: 121ms
memory: 3952kb

input:

100000
864 -604 868 -586
867 -598 866 -587
867 -601 866 -587
-973 -363 -967 -352
-971 -354 -969 -358
-968 -360 -968 -361
731 -847 734 -835
732 -845 733 -845
733 -845 732 -845
322 -154 356 -147
352 -148 342 -148
345 -148 355 -148
12 -593 16 -571
13 -580 14 -586
15 -592 13 -580
-665 293 -660 296
-663 ...

output:

3.961038961
0
36.000000000
49.000000000
60.000000000
15.000000000
71.500000000
0
40.000000000
36.000000000
104.000000000
24.000000000
12.000000000
48.000000000
0
6.000000000
12.000000000
130.000000000
112.000000000
0.600000000
88.000000000
88.000000000
18.000000000
0
198.000000000
0
112.000000000
70...

result:

ok 100000 numbers

Test #14:

score: 0
Accepted
time: 191ms
memory: 3996kb

input:

100000
11 -579 21 -575
14 -578 15 -576
14 -578 15 -576
638 916 653 935
650 925 650 929
650 918 650 927
207 -519 210 -495
209 -504 209 -499
209 -517 209 -503
-892 533 -879 547
-886 535 -891 545
-886 535 -891 545
24 -431 48 -381
25 -385 45 -415
45 -415 41 -397
-260 675 -253 742
-254 711 -257 731
-257 ...

output:

40.000000000
30.000000000
3.000000000
182.000000000
238.000000000
469.000000000
3.021052632
85.000000000
0
2304.000000000
5.000000000
48.000000000
732.000000000
272.000000000
0
0
0
378.000000000
387.000000000
12.833333333
357.954545455
0
270.000000000
139.714285714
425.000000000
120.000000000
51.000...

result:

ok 100000 numbers

Test #15:

score: 0
Accepted
time: 119ms
memory: 3920kb

input:

100000
233 -984 278 -977
237 -981 238 -979
236 -983 238 -979
612 814 628 829
622 824 627 818
622 824 627 818
948 403 965 406
953 404 951 405
951 405 953 404
-709 840 -551 862
-701 861 -630 847
-630 847 -701 861
536 523 543 534
537 524 541 525
541 525 537 524
-63 -483 -49 -466
-50 -477 -52 -480
-52 -...

output:

290.000000000
240.000000000
51.000000000
3476.000000000
77.000000000
8.571428571
0
1092.000000000
2662.000000000
187.850000000
836.000000000
960.000000000
0
0
861.800000000
2171.714285714
12463.000000000
0
159.250000000
320.000000000
198.000000000
10.941176471
31.711111111
0
225.000000000
77.0416666...

result:

ok 100000 numbers

Test #16:

score: 0
Accepted
time: 148ms
memory: 3952kb

input:

100000
725 209 729 214
727 210 726 211
726 211 727 210
660 -376 740 -226
738 -238 709 -291
738 -238 709 -291
149 -399 200 -264
196 -298 186 -384
196 -298 186 -384
312 -847 455 -765
390 -772 426 -813
426 -813 390 -772
947 -739 957 -632
956 -685 955 -693
955 -693 950 -733
-30 -883 -23 -878
-29 -882 -2...

output:

20.000000000
12000.000000000
6885.000000000
11726.000000000
0
8.000000000
612.000000000
0
1180.000000000
19234.000000000
0
0
0
5896.000000000
0
3213.000000000
492.000000000
0
0
1838.200000000
0
0
450.000000000
8700.000000000
5885.000000000
240.000000000
882.000000000
0
6678.000000000
0
2633.27272727...

result:

ok 100000 numbers

Test #17:

score: 0
Accepted
time: 150ms
memory: 3916kb

input:

100000
-382 62 -103 103
-249 90 -246 99
-155 84 -246 99
-216 2 -111 48
-209 5 -153 3
-140 32 -166 39
-266 326 -109 379
-183 354 -208 346
-208 346 -183 354
-398 -169 327 192
-305 69 190 -164
-305 69 190 -164
-611 -877 -385 -717
-529 -784 -413 -775
-529 -784 -413 -775
-356 -68 -258 -48
-279 -49 -336 -...

output:

25.318681319
0
8321.000000000
261725.000000000
36160.000000000
0
148708.000000000
1048.684210526
33420.558139535
23546.000000000
6453.847807018
1156.000000000
17.964912281
629.787037037
24010.836363636
2430.000000000
0
3251.306250000
1090.400000000
55647.000000000
0
8321.000000000
645.250000000
1022...

result:

ok 100000 numbers

Test #18:

score: 0
Accepted
time: 155ms
memory: 4080kb

input:

100000
-670 -906 906 875
76 659 787 -116
787 -116 76 659
-512 346 718 508
87 409 344 492
657 449 344 492
-129 -479 474 487
234 -281 374 -23
29 357 164 -410
-370 -981 -168 987
-310 377 -198 -801
-310 377 -224 985
-919 -182 943 834
-465 389 -403 402
-403 402 -217 441
-550 -982 -534 418
-542 -847 -542 ...

output:

2806856.000000000
58.923185938
0
425.742784380
0
22400.000000000
415800.000000000
0
813732.000000000
1094143.940774487
442188.000000000
0
0
0
62167.339805825
1417705.404538578
0
495772.681017613
0
19473.311514505
1050141.585053671
131498.586427661
89262.000000000
197143.232499365
1458016.000000000
1...

result:

ok 100000 numbers

Test #19:

score: 0
Accepted
time: 163ms
memory: 4020kb

input:

100000
-1000 -857 805 872
303 182 -659 649
-659 649 303 182
-983 -960 901 944
-346 -598 -518 380
-432 -109 -604 869
-997 -952 965 920
733 -238 -389 -846
733 -238 -389 -846
-956 -970 980 994
-247 824 -479 664
-566 604 -305 784
-975 -746 883 894
-338 217 -827 497
-827 497 151 -63
-791 -588 946 900
202...

output:

3120845.000000000
949771.018404908
3672864.000000000
504273.931034483
910394.519427403
2584656.000000000
0
3346200.000000000
3722814.000000000
0
3455808.000000000
3381192.000000000
3000370.000000000
0
0
453073.424668630
1196461.746293245
446688.221084169
0
147342.416729400
122660.997815267
854498.60...

result:

ok 100000 numbers

Test #20:

score: 0
Accepted
time: 147ms
memory: 3864kb

input:

100000
-1000 -999 1000 998
339 -905 140 -133
140 -133 657 231
-992 -982 991 998
-250 -429 -135 -67
-365 -791 -250 -429
-966 -976 980 981
303 -92 106 -551
303 -92 106 -551
-997 -992 996 997
793 744 -740 -330
282 386 -229 28
-1000 -999 999 993
333 573 -767 222
333 573 -767 222
-981 -985 999 993
-273 -...

output:

1006535.999879737
0
3808322.000000000
1470130.783216172
3982008.000000000
298549.565217391
3548251.882853929
1288381.266080378
3876561.000000000
0
253344.000000000
0
0
49050.532368970
464519.025452179
3924280.000000000
3172778.508370146
0
3936112.000000000
1566180.000000000
3926232.000000000
3922074...

result:

ok 100000 numbers

Test #21:

score: 0
Accepted
time: 131ms
memory: 4020kb

input:

100000
52 -610 56 -606
54 -608 55 -607
55 -608 53 -607
-353 -35 -349 -31
-351 -32 -351 -34
-352 -33 -351 -32
839 -323 842 -313
841 -321 840 -318
841 -321 840 -318
938 -62 941 -58
940 -61 939 -60
940 -61 939 -60
-702 416 -699 423
-700 419 -700 417
-700 419 -700 417
-337 349 -332 353
-333 351 -333 350...

output:

0
2.500000000
30.000000000
12.000000000
21.000000000
10.000000000
9.000000000
1.500000000
7.000000000
0
18.000000000
36.000000000
24.000000000
9.000000000
5.000000000
0
21.000000000
30.000000000
12.000000000
9.500000000
0
20.000000000
10.000000000
35.000000000
16.000000000
63.000000000
42.000000000
...

result:

ok 100000 numbers

Test #22:

score: 0
Accepted
time: 138ms
memory: 4024kb

input:

100000
-537 167 -533 182
-534 180 -534 173
-534 176 -534 180
-165 -532 -131 -523
-161 -525 -157 -524
-157 -524 -161 -525
899 556 904 564
901 560 900 561
900 561 902 559
-931 542 -914 549
-930 543 -926 543
-930 543 -918 543
807 -892 816 -876
815 -885 814 -881
815 -885 814 -881
597 -596 606 -579
600 -...

output:

24.000000000
306.000000000
17.500000000
35.000000000
144.000000000
153.000000000
52.000000000
0
0
36.000000000
56.000000000
4.375000000
0
172.000000000
20.000000000
0
161.000000000
40.000000000
98.850000000
11.716666667
112.000000000
56.000000000
238.000000000
0
32.000000000
756.000000000
0
0
199.50...

result:

ok 100000 numbers

Test #23:

score: 0
Accepted
time: 155ms
memory: 4024kb

input:

100000
-162 86 -148 92
-154 87 -150 91
-160 91 -154 87
160 -125 167 -121
161 -122 165 -124
161 -122 164 -122
-635 366 -618 382
-620 374 -622 378
-623 380 -621 376
615 -689 632 -668
631 -676 621 -680
631 -676 621 -680
-278 61 -273 87
-277 69 -275 84
-275 84 -277 69
289 534 301 547
299 545 292 544
299...

output:

0.833333333
2.000000000
42.500000000
357.000000000
130.000000000
156.000000000
33.000000000
17.378571429
154.000000000
36.000000000
24.000000000
32.000000000
0
8.041666667
506.000000000
0
177.896739130
26.666666667
434.000000000
742.000000000
109.375000000
3.000000000
232.000000000
0
0
0
0
2146.0000...

result:

ok 100000 numbers

Test #24:

score: 0
Accepted
time: 141ms
memory: 4160kb

input:

100000
-27 318 2 328
-3 320 -23 326
-23 326 -3 320
444 632 486 691
484 638 458 686
471 662 484 638
-630 909 -627 954
-628 912 -629 918
-629 918 -628 912
-393 509 -389 559
-390 532 -390 510
-390 532 -390 510
945 -907 964 -866
952 -869 951 -896
949 -875 956 -877
272 584 286 615
276 599 273 602
276 599...

output:

290.000000000
1123.500000000
135.000000000
200.000000000
0
218.666666667
0
400.000000000
0
2275.000000000
1152.000000000
54.000000000
169.763157895
167.142857143
34.000000000
2.625000000
0
2480.000000000
0
396.000000000
2262.000000000
315.000000000
175.000000000
390.000000000
1719.720279720
857.8125...

result:

ok 100000 numbers

Test #25:

score: 0
Accepted
time: 150ms
memory: 3888kb

input:

100000
-48 216 12 300
-42 226 2 269
2 269 -42 226
449 -897 523 -671
511 -707 503 -724
452 -743 495 -741
-132 -959 -58 -943
-83 -948 -113 -947
-69 -956 -113 -947
199 -522 296 -129
228 -308 255 -426
255 -426 228 -308
337 -855 388 -818
355 -852 366 -840
366 -840 355 -852
727 712 924 817
736 814 795 773...

output:

5040.000000000
0
289.539393939
38121.000000000
1887.000000000
0
3160.000000000
204.500000000
0
20114.000000000
0
814.000000000
397.401666667
13585.714285714
0
217.692307692
242.857142857
0
57528.000000000
307.795454545
242.000000000
0
2371.588235294
3952.000000000
702.800000000
4.392857143
512.58823...

result:

ok 100000 numbers

Test #26:

score: 0
Accepted
time: 182ms
memory: 3928kb

input:

100000
69 -124 92 -99
90 -103 89 -117
90 -103 89 -117
569 -330 587 -111
572 -194 580 -119
572 -194 580 -119
457 468 830 914
753 680 621 606
489 532 621 606
462 -15 551 70
521 -1 506 -1
504 -1 476 -1
-29 152 111 582
3 254 -1 441
34 335 36 484
-367 -578 -362 -150
-364 -245 -365 -458
-365 -458 -364 -24...

output:

575.000000000
3942.000000000
0
0
0
2140.000000000
21010.000000000
18444.000000000
28665.000000000
0
14000.000000000
3336.000000000
8482.500000000
17800.000000000
66286.000000000
3822.000000000
55552.000000000
18285.000000000
96.000000000
13443.428571429
18354.090909091
0
319.407407407
269.361471861
...

result:

ok 100000 numbers

Test #27:

score: 0
Accepted
time: 176ms
memory: 4020kb

input:

100000
-935 -289 -491 868
-614 -6 -860 344
-860 344 -614 -6
-283 -623 420 999
-36 -349 -80 -442
-124 -535 8 -256
-378 -817 55 914
-127 -314 -37 633
-127 -314 -37 633
-249 -550 754 889
509 -515 287 62
509 -515 65 639
-987 -629 887 286
810 -560 301 -383
301 -383 810 -560
-836 -839 132 745
-661 -812 -2...

output:

513708.000000000
76751.289222874
749523.000000000
600522.348353553
1714710.000000000
1533312.000000000
0
0
0
100436.000000000
430802.452471483
0
594520.000000000
1225296.000000000
1088724.000000000
0
1184592.000000000
504000.000000000
859214.000000000
1345408.000000000
205049.345744681
0
198385.1130...

result:

ok 100000 numbers

Test #28:

score: 0
Accepted
time: 147ms
memory: 4024kb

input:

100000
-967 -986 989 976
60 -380 -347 453
60 -380 -347 453
-943 -995 933 978
887 410 -500 -140
887 410 -500 -140
-870 -835 977 994
181 -581 823 -821
823 -821 181 -581
-985 -832 772 915
-551 402 214 884
-551 402 214 884
-969 -820 988 965
478 326 551 34
420 558 551 34
-988 -344 997 877
-942 -184 -881 ...

output:

3837672.000000000
3701348.000000000
3378163.000000000
3069479.000000000
2013508.375000000
2423685.000000000
0
91400.579717357
3743904.000000000
700867.697717883
370580.458869078
0
106662.215302938
0
3922368.000000000
333909.225792502
3710304.000000000
1823880.559544658
3090988.000000000
0
1109919.53...

result:

ok 100000 numbers

Test #29:

score: 0
Accepted
time: 155ms
memory: 4040kb

input:

100000
-992 -991 993 999
-287 723 -688 -530
-688 -530 -287 723
-999 -1000 1000 1000
-841 -413 137 359
626 745 -352 -27
-997 -1000 997 986
-77 222 -133 959
-133 959 -77 222
-1000 -996 998 978
616 432 793 -930
616 432 793 -930
-1000 -994 977 965
776 -646 970 690
873 22 970 690
-973 -982 993 999
-796 8...

output:

3950150.000000000
1542553.845190036
3960084.000000000
3944052.000000000
1610389.322604790
3894646.000000000
3830324.000000000
1834613.214470284
256920.086896718
0
0
3986006.000000000
3990000.000000000
0
0
3874290.000000000
3876880.000000000
147406.578149468
278190.712165593
3934272.000000000
1405011...

result:

ok 100000 numbers

Test #30:

score: 0
Accepted
time: 162ms
memory: 3860kb

input:

100000
757 -469 768 -466
763 -467 759 -468
759 -468 763 -467
-860 -809 -842 -799
-859 -802 -849 -804
-854 -803 -844 -805
-580 -402 -576 -398
-579 -400 -579 -399
-577 -399 -579 -400
-615 364 -599 375
-605 368 -607 373
-605 368 -607 373
141 -198 160 -187
146 -193 150 -190
142 -196 146 -193
-521 -135 -...

output:

33.000000000
52.000000000
3.000000000
176.000000000
0
20.633333333
35.000000000
5.000000000
12.000000000
12.000000000
90.000000000
44.000000000
12.000000000
48.000000000
15.950000000
19.416666667
156.000000000
0
0
6.000000000
10.000000000
40.000000000
48.000000000
0
153.000000000
0
0
85.833333333
12...

result:

ok 100000 numbers

Test #31:

score: 0
Accepted
time: 129ms
memory: 3996kb

input:

100000
24 -943 45 -937
33 -939 31 -940
31 -940 29 -941
24 -407 47 -374
26 -397 40 -382
30 -405 26 -397
-338 -401 -335 -398
-337 -399 -336 -399
-337 -399 -336 -399
-186 554 -141 558
-151 555 -176 556
-151 555 -176 556
-624 109 -617 177
-621 175 -620 157
-622 137 -619 139
-930 -172 -903 -158
-911 -161...

output:

0
2.866666667
9.000000000
180.000000000
0
154.000000000
0
263.500000000
238.000000000
374.000000000
1242.958333333
23.980769231
144.000000000
0
0
551.000000000
0
81.000000000
310.000000000
15.000000000
42.000000000
96.000000000
4.000000000
0
0
375.000000000
0
150.000000000
0
928.000000000
0
19.20000...

result:

ok 100000 numbers

Test #32:

score: 0
Accepted
time: 150ms
memory: 4024kb

input:

100000
-907 -546 -898 -457
-902 -502 -901 -463
-902 -502 -901 -463
-366 -693 -359 -646
-363 -663 -364 -665
-361 -659 -364 -665
373 -119 390 -110
378 -111 385 -111
376 -111 388 -111
-737 -682 -720 -679
-728 -680 -729 -680
-727 -681 -729 -680
695 214 731 263
723 247 700 218
711 219 709 250
482 -243 48...

output:

801.000000000
208.250000000
63.000000000
23.000000000
0
84.000000000
810.000000000
0
1860.000000000
1656.000000000
56.000000000
204.000000000
290.000000000
1010.000000000
13.520833333
156.000000000
867.000000000
2950.000000000
18.000000000
0
282.000000000
9.000000000
499.218750000
64.000000000
33.33...

result:

ok 100000 numbers

Test #33:

score: 0
Accepted
time: 150ms
memory: 4144kb

input:

100000
-737 590 -688 597
-732 595 -731 596
-732 595 -736 591
24 -730 52 -476
35 -564 34 -652
35 -564 34 -652
480 -273 562 -155
530 -248 511 -272
530 -248 549 -224
-370 -155 -355 -22
-368 -152 -364 -46
-364 -76 -367 -23
430 827 489 899
454 840 432 869
432 869 473 847
-310 -126 -179 -27
-204 -36 -281 ...

output:

0
7112.000000000
0
0
302.980656013
12969.000000000
3645.000000000
132.000000000
5.954861111
29016.000000000
0
31987.593750000
5022.000000000
112.559055809
0
1.125000000
5349.175000000
7920.000000000
0
1360.644664466
475.333333333
492.375831486
0
2751.000000000
10329.462962963
0
0.975000000
4976.5000...

result:

ok 100000 numbers

Test #34:

score: 0
Accepted
time: 164ms
memory: 3944kb

input:

100000
-717 -894 -455 -770
-597 -886 -533 -836
-533 -836 -565 -861
-798 -326 -742 75
-782 -234 -759 -35
-782 -234 -759 -35
113 -696 295 -596
277 -641 217 -650
117 -665 177 -656
280 -873 734 -751
733 -843 427 -863
344 -796 427 -863
-685 -613 -543 -590
-598 -601 -596 -612
-596 -612 -567 -595
734 309 9...

output:

16449.375000000
22456.000000000
0
43.629419639
3.043103448
872.347321429
39611.000000000
17.045454545
0
5594.575357536
0
36295.724137931
7812.000000000
15811.000000000
0
0
38318.995014245
0
0
3822.875000000
22888.861559140
2808.000000000
1796.184090909
21867.391304348
15620.000000000
0
12850.0000000...

result:

ok 100000 numbers

Test #35:

score: 0
Accepted
time: 147ms
memory: 3876kb

input:

100000
-935 -968 975 962
310 93 414 637
219 -383 115 -927
-998 -975 937 981
390 157 -401 -464
390 157 -401 -464
-995 -419 994 865
-281 846 -197 -136
-197 -136 -239 355
-975 -964 998 941
-576 -35 -328 781
-359 679 -328 781
-983 -938 927 845
159 -827 528 481
282 -391 405 45
-982 -967 951 970
804 -685 ...

output:

0
3784860.000000000
1580064.030549898
739091.602941176
899036.123853211
66224.352257012
0
3430916.000000000
2071579.180743243
245252.309977843
643532.427184466
3323293.000000000
3347344.000000000
0
0
4229.381075082
2317345.000000000
0
3371019.000000000
3519488.000000000
2910075.000000000
1963745.302...

result:

ok 100000 numbers