QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#639908#5461. Paddle StarasitshouldbeAC ✓256ms4492kbC++1740.6kb2024-10-13 23:50:122024-10-13 23:50:13

Judging History

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

  • [2024-10-13 23:50:13]
  • 评测
  • 测评结果:AC
  • 用时:256ms
  • 内存:4492kb
  • [2024-10-13 23:50:12]
  • 提交

answer

#include <bits/stdc++.h>
#define pi acos(-1.0)
// #define double long double
using namespace std;
typedef long long LL;
const double eps = 1e-8, inf = 1e12;
const int N = 1e2 + 10;
int sgn(double x)
{
    if (fabs(x) < eps) return 0;
    if (x < 0) return -1;
    else return 1;
}
int dsgn(double x, double y)
{
    if (fabs(x - y) < eps) return 0;
    if (x < y) return -1;
    else return 1;
}
inline double sqr(double x) { return x * x; }

struct Point
{
    double x, y;
    Point() {}
    Point(double _x, double _y) { x = _x;y = _y; }
    void input() { cin >> x >> y; }
    bool operator==(Point b) const { return sgn(x - b.x) == 0 && sgn(y - b.y) == 0; }
    bool operator<(Point b) const { return sgn(x - b.x) == 0 ? sgn(y - b.y) < 0 : x < b.x; }
    Point operator-(const Point &b) const { return Point(x - b.x, y - b.y); }
    Point operator+(const Point &b) const { return Point(x + b.x, y + b.y); }
    // 叉积
    double operator^(const Point &b) const { return x * b.y - y * b.x; }
    // 点积
    double operator*(const Point &b) const { return x * b.x + y * b.y; }
    // 数乘
    Point operator*(const double &k) const {return Point(x * k, y * k);}
    Point operator/(const double &k) const { return Point(x / k, y / k);}
    // 返回长度
    double len() { return hypot(x, y); }
    // 返回长度的平方
    double len2() { return x * x + y * y; }
    // 返回两点的距离
    double distance(Point p) { return hypot(x - p.x, y - p.y); }
    LL distance2(Point p) { return (x - p.x) * (x - p.x) + (y - p.y) * (y - p.y); }
    //`计算pa  和  pb 的夹角 就是求这个点看a,b 所成的夹角`
    //`测试 LightOJ1203`
    double rad(Point a, Point b)
    {
        Point p = *this;
        return fabs(atan2(fabs((a - p) ^ (b - p)), (a - p) * (b - p)));
    }
    //`绕着p点逆时针旋转angle`
    Point rotate(Point p, double angle)
    {
        Point v = (*this) - p;
        double c = cos(angle), s = sin(angle);
        return Point(p.x + v.x * c - v.y * s, p.y + v.x * s + v.y * c);
    }
    //`化为长度为r的向量`
    Point trunc(double r)
    {
        double l = len();
        if (!sgn(l)) return *this;
        r /= l;
        return Point(x * r, y * r);
    }
    //`逆时针旋转90度`
    Point rotleft() { return Point(-y, x); }
    //`顺时针旋转90度`;
    Point rotright() { return Point(y, -x); }
};
//`AB X AC`
double cross(Point A, Point B, Point C) { return (B - A) ^ (C - A); }
//`AB*AC`
double dot(Point A, Point B, Point C) { return (B - A) * (C - A); }
struct Line
{
    Point s, e;
    Line() {}
    Line(Point _s, Point _e) { s = _s;e = _e; }
    bool operator==(Line v) { return (s == v.s) && (e == v.e); }
    //`根据一个点和倾斜角angle确定直线,0<=angle<pi`
    Line(Point p, double angle)
    {
        s = p;
        if (sgn(angle - pi / 2) == 0) e = (s + Point(0, 1));
        else e = (s + Point(1, tan(angle)));
    }
    // ax+by+c=0
    Line(double a, double b, double c)
    {
        if (sgn(a) == 0)
        {
            s = Point(0, -c / b);
            e = Point(1, -c / b);
        }
        else if (sgn(b) == 0)
        {
            s = Point(-c / a, 0);
            e = Point(-c / a, 1);
        }
        else
        {
            s = Point(0, -c / b);
            e = Point(1, (-c - a) / b);
        }
    }
    void input() { s.input();e.input(); }
    void adjust() { if (e < s) swap(s, e); }
    // 求线段长度
    double length() { return s.distance(e); }
    //`返回直线倾斜角 0<=angle<pi`
    double angle()
    {
        double k = atan2(e.y - s.y, e.x - s.x);
        // if(sgn(k) < 0)k += pi;
        // if(sgn(k-pi) == 0)k -= pi;
        return k;
    }
    bool operator<(Line &v) { return sgn(angle() - v.angle()) == 0 ? ((e - s) ^ (v.e - s)) < 0 : angle() < v.angle(); }
    //`点和直线关系`
    int relation(Point p)
    {
        int c = sgn((p - s) ^ (e - s));
        if (c < 0) return 1;      //`1  在左侧`
        else if (c > 0) return 2; //`2  在右侧`
        else return 3;            //`3  在直线上`
    }
    //`点在线段上的判断`
    bool pointonseg(Point p) { return sgn((p - s) ^ (e - s)) == 0 && sgn((p - s) * (p - e)) <= 0; }
    //`两向量平行(对应直线平行或重合)`
    bool parallel(Line v) { return sgn((e - s) ^ (v.e - v.s)) == 0; }
    //`两向量正交`
    bool orthogonal(Line v) { return sgn((e - s) * (v.e - v.s)) == 0; }
    //`两直线关系`
    int linecrossline(Line v)
    {
        if ((*this).parallel(v))             //`0 平行`
            return v.relation(s) == 3;       //`1 重合`
        if ((*this).orthogonal(v)) return 3; //`3 正交`
        else return 2;                       //`2 相交`
    }
    //`两线段相交判断`
    int segcrossseg(Line v)
    {
        int d1 = sgn((e - s) ^ (v.s - s));
        int d2 = sgn((e - s) ^ (v.e - s));
        int d3 = sgn((v.e - v.s) ^ (s - v.s));
        int d4 = sgn((v.e - v.s) ^ (e - v.s));
        if ((d1 ^ d2) == -2 && (d3 ^ d4) == -2) return 2;      //`2 规范相交`
        return (d1 == 0 && sgn((v.s - s) * (v.s - e)) <= 0) || //`1 非规范相交`
               (d2 == 0 && sgn((v.e - s) * (v.e - e)) <= 0) || //`0 不相交`
               (d3 == 0 && sgn((s - v.s) * (s - v.e)) <= 0) ||
               (d4 == 0 && sgn((e - v.s) * (e - v.e)) <= 0);
    }
    //`直线和线段相交判断`
    int linecrossseg(Line v)
    {
        int d1 = sgn((e - s) ^ (v.s - s));
        int d2 = sgn((e - s) ^ (v.e - s));
        if ((d1 ^ d2) == -2) return 2;     //`2 规范相交`
        return (d1 == 0 || d2 == 0);       //`1 非规范相交 0 不相交`
    }
    //`求两直线的交点  要保证两直线不平行或重合`
    Point crosspoint(Line l)
    {
        Point u = e - s, v = l.e - l.s;
        double t = (s - l.s) ^ v / (v ^ u);
        return s + u * t;
    }
    //`返回点p在直线上的投影`
    Point lineprog(Point p)
    {
        Point u = e - s, v = p - s;
        return s + u * (u * v / u.len2());
    }
    // 点到直线的距离
    double dispointtoline(Point p) { return fabs((p - s) ^ (e - s)) / length(); }
    // 点到线段的距离
    double dispointtoseg(Point p)
    {
        if (sgn((p - s) * (e - s)) < 0 || sgn((p - e) * (s - e)) < 0)
            return min(p.distance(s), p.distance(e));
        return dispointtoline(p);
    }
    //`返回线段到线段的距离 前提是两线段不相交,相交距离就是0了`
    double dissegtoseg(Line v)
    {
        return min(min(dispointtoseg(v.s), dispointtoseg(v.e)), min(v.dispointtoseg(s), v.dispointtoseg(e)));
    }
    //`返回点p关于直线的对称点`
    Point symmetrypoint(Point p)
    {
        Point pro = lineprog(p);
        return pro * 2 - p;
    }
};

struct circle
{
    Point p;  // 圆心
    double r; // 半径
    circle() {}
    circle(Point _p, double _r) { p = _p;r = _r; }
    circle(double x, double y, double _r) { p = Point(x, y);r = _r; }
    //`三角形的外接圆`
    //`需要Point的+ /  rotate()  以及Line的crosspoint()`
    //`利用两条边的中垂线得到圆心`
    //`测试:UVA12304`
    circle(Point a, Point b, Point c)
    {
        Line u = Line((a + b) / 2, ((a + b) / 2) + ((b - a).rotleft()));
        Line v = Line((b + c) / 2, ((b + c) / 2) + ((c - b).rotleft()));
        p = u.crosspoint(v);
        r = p.distance(a);
    }
    //`三角形的内切圆`
    //`参数bool t没有作用,只是为了和上面外接圆函数区别`
    //`测试:UVA12304`
    circle(Point a, Point b, Point c, bool t)
    {
        Line u, v;
        double m = atan2(b.y - a.y, b.x - a.x), n = atan2(c.y - a.y, c.x - a.x);
        u.s = a;
        u.e = u.s + Point(cos((n + m) / 2), sin((n + m) / 2));
        v.s = b;
        m = atan2(a.y - b.y, a.x - b.x), n = atan2(c.y - b.y, c.x - b.x);
        v.e = v.s + Point(cos((n + m) / 2), sin((n + m) / 2));
        p = u.crosspoint(v);
        r = Line(a, b).dispointtoseg(p);
    }
    // 输入
    void input() { p.input();cin >> r; }
    bool operator==(circle v) { return (p == v.p) && sgn(r - v.r) == 0; }
    bool operator<(circle v) const { return ((p < v.p) || ((p == v.p) && sgn(r - v.r) < 0)); }
    // 面积
    double area() { return pi * r * r; }
    // 周长
    double circumference() { return 2 * pi * r; }
    //`点和圆的关系`
    int relation(Point b)
    {
        double dst = b.distance(p);
        if (sgn(dst - r) < 0) return 2;       //`2 圆内`
        else if (sgn(dst - r) == 0) return 1; //`1 圆上`
        return 0;                             //`0 圆外`
    }
    //`线段和圆的关系 比较的是圆心到线段的距离和半径的关系`
    int relationseg(Line v)
    {
        double dst = v.dispointtoseg(p);
        if (sgn(dst - r) < 0) return 2;       //`2 相交`
        else if (sgn(dst - r) == 0) return 1; //`1 相切`
        return 0;                             //`0 相离`
    }
    //`直线和圆的关系 比较的是圆心到直线的距离和半径的关系`
    int relationline(Line v)
    {
        double dst = v.dispointtoline(p);
        if (sgn(dst - r) < 0) return 2;       //`2 相交`
        else if (sgn(dst - r) == 0) return 1; //`1 相切`
        return 0;                             //`0 相离`
    }
    //`两圆的关系 需要Point的distance`
    //`测试:UVA12304`
    int relationcircle(circle v)
    {
        double d = p.distance(v.p);
        if (sgn(d - r - v.r) > 0) return 5;                   //`5 相离`
        if (sgn(d - r - v.r) == 0) return 4;                  //`4 外切`
        double l = fabs(r - v.r);
        if (sgn(d - r - v.r) < 0 && sgn(d - l) > 0) return 3; //`3 相交`
        if (sgn(d - l) == 0) return 2;                        //`2 内切`
        if (sgn(d - l) < 0) return 1;                         //`1 内含`
    }
    //`求两个圆的交点 需要relationcircle`
    //`测试:UVA12304`
    int pointcrosscircle(circle v, Point &p1, Point &p2)
    {
        int rel = relationcircle(v);
        if (rel == 1 || rel == 5) return 0;               //`0 无交点`
        double d = p.distance(v.p);
        double l = (d * d + r * r - v.r * v.r) / (2 * d);
        double h = sqrt(r * r - l * l);
        Point tmp = p + (v.p - p).trunc(l);
        p1 = tmp + ((v.p - p).rotleft().trunc(h));
        p2 = tmp + ((v.p - p).rotright().trunc(h));
        if (rel == 2 || rel == 4) return 1;               //`1 一个交点`
        return 2;                                         //`2 两个交点`
    }
    //`求直线和圆的交点,返回交点个数`
    int pointcrossline(Line v, Point &p1, Point &p2)
    {
        if (!(*this).relationline(v)) return 0;
        Point a = v.lineprog(p);
        double d = v.dispointtoline(p);
        d = sqrt(r * r - d * d);
        if (sgn(d) == 0)
        {
            p1 = a;
            p2 = a;
            return 1;
        }
        p1 = a + (v.e - v.s).trunc(d);
        p2 = a - (v.e - v.s).trunc(d);
        return 2;
    }
    //`得到过a,b两点,半径为r1的两个圆`
    int gercircle(Point a, Point b, double r1, circle &c1, circle &c2)
    {
        circle x(a, r1), y(b, r1);
        int t = x.pointcrosscircle(y, c1.p, c2.p);
        if (!t) return 0;
        c1.r = c2.r = r;
        return t; //`返回圆的个数`
    }
    //`得到与直线u相切,过点q,半径为r1的圆`
    //`测试:UVA12304`
    int getcircle(Line u, Point q, double r1, circle &c1, circle &c2)
    {
        double dis = u.dispointtoline(q);
        if (sgn(dis - r1 * 2) > 0) return 0;
        if (sgn(dis) == 0)
        {
            c1.p = q + ((u.e - u.s).rotleft().trunc(r1));
            c2.p = q + ((u.e - u.s).rotright().trunc(r1));
            c1.r = c2.r = r1;
            return 2;
        }
        Line u1 = Line((u.s + (u.e - u.s).rotleft().trunc(r1)), (u.e + (u.e - u.s).rotleft().trunc(r1)));
        Line u2 = Line((u.s + (u.e - u.s).rotright().trunc(r1)), (u.e + (u.e - u.s).rotright().trunc(r1)));
        circle cc = circle(q, r1);
        Point p1, p2;
        if (!cc.pointcrossline(u1, p1, p2)) cc.pointcrossline(u2, p1, p2);
        c1 = circle(p1, r1);
        if (p1 == p2)
        {
            c2 = c1;
            return 1;
        }
        c2 = circle(p2, r1);
        return 2;
    }
    //`同时与直线u,v相切,半径为r1的圆`
    //`测试:UVA12304`
    int getcircle(Line u, Line v, double r1, circle &c1, circle &c2, circle &c3, circle &c4)
    {
        if (u.parallel(v)) return 0; // 两直线平行
        Line u1 = Line(u.s + (u.e - u.s).rotleft().trunc(r1), u.e + (u.e - u.s).rotleft().trunc(r1));
        Line u2 = Line(u.s + (u.e - u.s).rotright().trunc(r1), u.e + (u.e - u.s).rotright().trunc(r1));
        Line v1 = Line(v.s + (v.e - v.s).rotleft().trunc(r1), v.e + (v.e - v.s).rotleft().trunc(r1));
        Line v2 = Line(v.s + (v.e - v.s).rotright().trunc(r1), v.e + (v.e - v.s).rotright().trunc(r1));
        c1.r = c2.r = c3.r = c4.r = r1;
        c1.p = u1.crosspoint(v1);
        c2.p = u1.crosspoint(v2);
        c3.p = u2.crosspoint(v1);
        c4.p = u2.crosspoint(v2);
        return 4;
    }
    //`同时与不相交圆cx,cy相切,半径为r1的圆`
    //`测试:UVA12304`
    int getcircle(circle cx, circle cy, double r1, circle &c1, circle &c2)
    {
        circle x(cx.p, r1 + cx.r), y(cy.p, r1 + cy.r);
        int t = x.pointcrosscircle(y, c1.p, c2.p);
        if (!t) return 0;
        c1.r = c2.r = r1;
        return t; //`返回圆的个数`
    }
    //`过一点作圆的切线(先判断点和圆的关系)`
    //`测试:UVA12304`
    int tangentline(Point q, Line &u, Line &v)
    {
        int x = relation(q);
        if (x == 2)  return 0;
        if (x == 1)
        {
            u = Line(q, q + (q - p).rotleft());
            v = u;
            return 1;
        }
        double d = p.distance(q);
        double l = r * r / d;
        double h = sqrt(r * r - l * l);
        u = Line(q, p + ((q - p).trunc(l) + (q - p).rotleft().trunc(h)));
        v = Line(q, p + ((q - p).trunc(l) + (q - p).rotright().trunc(h)));
        return 2; //`返回切线的个数`
    }
    int tangentpoint(Point q, Point &u, Point &v)
    {
        int x = relation(q);
        if (x == 2) return 0;
        if (x == 1)
        {
            u = q;
            v = u;
            return 1;
        }
        double d = p.distance(q);
        double l = r * r / d;
        double h = sqrt(r * r - l * l);
        u = p + ((q - p).trunc(l) + (q - p).rotleft().trunc(h));
        v = p + ((q - p).trunc(l) + (q - p).rotright().trunc(h));
        return 2; //`返回切点的个数`
    }
    //`求两圆相交的面积`
    double areacircle(circle v)
    {
        int rel = relationcircle(v);
        if (rel >= 4) return 0.0;
        if (rel <= 2) return min(area(), v.area());
        double d = p.distance(v.p);
        double hf = (r + v.r + d) / 2.0;
        double ss = 2 * sqrt(hf * (hf - r) * (hf - v.r) * (hf - d));
        double a1 = acos((r * r + d * d - v.r * v.r) / (2.0 * r * d));
        a1 = a1 * r * r;
        double a2 = acos((v.r * v.r + d * d - r * r) / (2.0 * v.r * d));
        a2 = a2 * v.r * v.r;
        return a1 + a2 - ss;
    }
    //`求圆和三角形pab的相交面积`
    //`测试:POJ3675 HDU3982 HDU2892`
    double areatriangle(Point a, Point b)
    {
        if (sgn((p - a) ^ (p - b)) == 0) return 0.0;
        Point q[5],p1, p2;
        int len = 0;
        q[len++] = a;
        Line l(a, b);
        if (pointcrossline(l, q[1], q[2]) == 2)
        {
            if (sgn((a - q[1]) * (b - q[1])) < 0) q[len++] = q[1];
            if (sgn((a - q[2]) * (b - q[2])) < 0) q[len++] = q[2];
        }
        q[len++] = b;
        if (len == 4 && sgn((q[0] - q[1]) * (q[2] - q[1])) > 0) swap(q[1], q[2]);
        double res = 0;
        for (int i = 0; i < len - 1; i++)
        {
            if (relation(q[i]) == 0 || relation(q[i + 1]) == 0)
            {
                double arg = p.rad(q[i], q[i + 1]);
                res += r * r * arg / 2.0;
            }
            else res += fabs((q[i] - p) ^ (q[i + 1] - p)) / 2.0;
        }
        return res;
    }
    //`两圆公切线`
    Point getpoint(double rad) { return Point(p.x + r * cos(rad), p.y + r * sin(rad)); }
    int conmontangent(circle v, vector<Point> &p1, vector<Point> &p2)
    {
        bool flag = 0;
        if (r < v.r) swap(*this, v), flag = 1;
        double d = p.distance(v.p), rd = r - v.r, rs = r + v.r;
        if (sgn(d - rd) < 0) return 0;
        if (sgn(d) == 0) return -1;
        double rad = Line(p, v.p).angle();
        if (sgn(d - rd) == 0)
        {
            p1.push_back(getpoint(rad)), p2.push_back(getpoint(rad));
            return 1; //`一条外公切线`
        }
        double rad1 = acos(rd / d);
        p1.push_back(getpoint(rad + rad1)), p2.push_back(v.getpoint(rad + rad1));
        p1.push_back(getpoint(rad - rad1)), p2.push_back(v.getpoint(rad - rad1));
        if (sgn(d - rs) == 0)
        {
            p1.push_back(getpoint(rad)), p2.push_back(getpoint(rad));
            if (flag) swap(p1, p2);
            return 3; //`两条外公切线 一条内公切线`
        }
        else if (sgn(d - rs) > 0)
        {
            double rad2 = acos(rs / d);
            p1.push_back(getpoint(rad + rad2)), p2.push_back(v.getpoint(rad + rad2 - pi));
            p1.push_back(getpoint(rad - rad2)), p2.push_back(v.getpoint(rad - rad2 + pi));
            if (flag) swap(p1, p2);
            return 4; //`两条外公切线 两条内公切线`
        }
        else
        {
            if (flag) swap(p1, p2);
            return 2; //`两条外公切线`
        }
    }
};

struct polygon
{
    int n;
    Point p[N];
    Line l[N];
    void input(int _n)
    {
        n = _n;
        for (int i = 0; i < n; i++) p[i].input();
    }
    void add(Point q) { p[n++] = q; }
    void getline()
    {
        for (int i = 0; i < n; i++)
            l[i] = Line(p[i], p[(i + 1) % n]);
    }
    struct cmp
    {
        Point p;
        cmp(const Point &p0) { p = p0; }
        bool operator()(const Point &aa, const Point &bb)
        {
            Point a = aa, b = bb;
            int d = sgn((a - p) ^ (b - p));
            if (d == 0) return sgn(a.distance(p) - b.distance(p)) < 0;
            return d > 0;
        }
    };
    //`进行极角排序 mi为极点`
    //`需要重载号好Point的 < 操作符(min函数要用) `
    void norm(Point mi)
    {
        // Point mi = p[0];
        // for(int i = 1;i < n;i++)mi = min(mi,p[i]);
        sort(p, p + n, cmp(mi));
    }
    //`得到的凸包里面的点编号是0-n-1的`
    //`注意如果有影响,要特判下所有点共点,或者共线的特殊情况`
    //`测试 LightOJ1203  LightOJ1239`
    void andrew(polygon &convex)
    {
        sort(p, p + n);
        int &top = convex.n;
        top = 0;
        for (int i = 0; i < n; i++)
        {
            while (top >= 2 && sgn(cross(convex.p[top - 2], convex.p[top - 1], p[i])) <= 0) top--;
            convex.p[top++] = p[i];
        }
        int temp = top;
        for (int i = n - 2; i >= 0; i--)
        {
            while (top > temp && sgn(cross(convex.p[top - 2], convex.p[top - 1], p[i])) <= 0) top--;
            convex.p[top++] = p[i];
        }
        top--;
    }
    //`判断是不是凸的`
    bool isconvex()
    {
        bool s[5];
        memset(s, false, sizeof(s));
        for (int i = 0; i < n; i++)
        {
            int j = (i + 1) % n, k = (j + 1) % n;
            s[sgn((p[j] - p[i]) ^ (p[k] - p[i])) + 1] = true;
            if (s[0] && s[2]) return false;
        }
        return true;
    }
    //`判断点和任意多边形的关系`
    int relationpoint(Point q)
    {
        for (int i = 0; i < n; i++)
            if (p[i] == q) return 3;                 //` 3 点上`
        for (int i = 0; i < n; i++)
            if (l[i].pointonseg(q)) return 2;        //` 2 边上`
        int cnt = 0;
        for (int i = 0; i < n; i++)
        {
            int j = (i + 1) % n;
            int k = sgn((q - p[j]) ^ (p[i] - p[j]));
            int u = sgn(p[i].y - q.y);
            int v = sgn(p[j].y - q.y);
            if (k > 0 && u < 0 && v >= 0) cnt++;
            if (k < 0 && v < 0 && u >= 0) cnt--;
        }                                            //` 1 内部`
        return cnt != 0;                             //` 0 外部`
    }
    //`直线u切割凸多边形左侧 注意直线方向`
    //`测试:HDU3982`
    void convexcut(Line u, polygon &po)
    {
        int &top = po.n; // 注意引用
        top = 0;
        for (int i = 0; i < n; i++)
        {
            int d1 = sgn((u.e - u.s) ^ (p[i] - u.s));
            int d2 = sgn((u.e - u.s) ^ (p[(i + 1) % n] - u.s));
            if (d1 >= 0) po.p[top++] = p[i];
            if (d1 * d2 < 0) po.p[top++] = u.crosspoint(Line(p[i], p[(i + 1) % n]));
        }
    }
    //`得到周长`
    //`测试 LightOJ1239`
    double getcircumference()
    {
        double sum = 0;
        for (int i = 0; i < n; i++)
            sum += p[i].distance(p[(i + 1) % n]);
        return sum;
    }
    //`得到面积`
    double getarea()
    {
        double sum = 0;
        for (int i = 0; i < n; i++)
            sum += (p[i] ^ p[(i + 1) % n]);
        return fabs(sum) / 2;
    }
    //`得到方向`
    bool getdir()
    {
        double sum = 0;
        for (int i = 0; i < n; i++)
            sum += (p[i] ^ p[(i + 1) % n]);
        if (sgn(sum) > 0) return 1; //` 1 逆时针`
        else return 0;              //` 0 顺时针`
    }
    //`得到重心`
    Point getbarycentre()
    {
        Point ret(0, 0);
        double area = 0;
        for (int i = 1; i < n - 1; i++)
        {
            double tmp = (p[i] - p[0]) ^ (p[i + 1] - p[0]);
            if (sgn(tmp) == 0) continue;
            area += tmp;
            ret.x += (p[0].x + p[i].x + p[i + 1].x) / 3 * tmp;
            ret.y += (p[0].y + p[i].y + p[i + 1].y) / 3 * tmp;
        }
        if (sgn(area)) ret = ret / area;
        return ret;
    }
    //`多边形和圆交的面积`
    //`测试:POJ3675 HDU3982 HDU2892`
    double areacircle(circle c)
    {
        double ans = 0;
        for (int i = 0; i < n; i++)
        {
            int j = (i + 1) % n;
            if (sgn((p[j] - c.p) ^ (p[i] - c.p)) >= 0) ans += c.areatriangle(p[i], p[j]);
            else ans -= c.areatriangle(p[i], p[j]);
        }
        return fabs(ans);
    }
    //`多边形和圆关系`
    int relationcircle(circle c)
    {
        int x = 2;                                  //` 2 圆完全在多边形内`
        if (relationpoint(c.p) != 1) return 0;      //` 0 圆心不在内部`
        for (int i = 0; i < n; i++)
        {
            if (c.relationseg(l[i]) == 2) return 0; //` 0 其它`
            if (c.relationseg(l[i]) == 1) x = 1;    //` 1 圆在多边形里面,碰到了多边形边界`
        }
        return x;
    }
    //`旋转卡壳求凸包直径(最远点对)`
    double rorating_calipers1()
    {
        double res = 0;
        for (int i = 0, j = 1; i < n; i++)
        {
            while (dsgn(cross(p[i], p[i + 1], p[j]), cross(p[i], p[i + 1], p[j + 1])) < 0) j = (j + 1) % n;
            res = max(res, max(p[i].distance(p[j]), p[i + 1].distance(p[j])));
        }
        return res;
    }
    //`旋转卡壳求最小矩形覆盖`
    double rorating_calipers2(polygon &pt)
    {
        double res = 1e20;
        for (int i = 0, a = 1, b = 1, c; i < n; i++)
        {
            while (dsgn(cross(p[i], p[i + 1], p[a]), cross(p[i], p[i + 1], p[a + 1])) < 0) a = (a + 1) % n;
            while (dsgn(dot(p[i], p[i + 1], p[b]), dot(p[i], p[i + 1], p[b + 1])) < 0) b = (b + 1) % n;
            if (!i) c = a;
            while (dsgn(dot(p[i + 1], p[i], p[c]), dot(p[i + 1], p[i], p[c + 1])) < 0) c = (c + 1) % n;
            double d = p[i].distance(p[i + 1]);
            double H = cross(p[i], p[i + 1], p[a]) / d;
            double R = dot(p[i], p[i + 1], p[b]) / d;
            double L = dot(p[i + 1], p[i], p[c]) / d;
            if (dsgn(res, (L + R - d) * H) > 0)
            {
                res = (L + R - d) * H;
                pt.p[0] = p[i + 1] + (p[i] - p[i + 1]) * (L / d);
                pt.p[1] = p[i] + (p[i + 1] - p[i]) * (R / d);
                pt.p[2] = pt.p[1] + (p[i + 1] - p[i]).rotleft() * (H / d);
                pt.p[3] = pt.p[0] + (p[i + 1] - p[i]).rotleft() * (H / d);
            }
        }
        return res;
    }
    //`分治法求最近点对`
    Point a[N];
    double divide(int l, int r)
    {
        if (l == r) return 2e9;
        if (l + 1 == r) return p[l].distance(p[r]);
        int mid = l + r >> 1;
        double d = min(divide(l, mid), divide(mid + 1, r));
        int k = 0;
        for (int i = l; i <= r; i++)
            if (fabs(p[mid].x - p[i].x) < d) a[k++] = p[i];
        // sort(a,a+k,[&](Point a,Point b)->bool {return a.y<b.y;});
        for (int i = 0; i < k; i++)
            for (int j = i + 1; j < k && a[j].y - a[i].y < d; j++)
                d = min(d, a[j].distance(a[i]));
        return d;
    }
    //`旋转卡壳求最大三角形面积`
    double rotating_calipers3()
    {
        double res = 0;
        for (int i = 0; i < n; i++)
        {
            int k = i + 1;
            for (int j = i + 1; j < n; j++)
            {
                while (dsgn(cross(p[i], p[j], p[k]), cross(p[i], p[j], p[k + 1])) < 0) k = (k + 1) % n;
                res = max(res, cross(p[i], p[j], p[k]));
            }
        }
        return res / 2;
    }
};
//`半平面交求凸多边形面积交`
double half_plane1(Line l[], int n)
{
    double res = 0;
    sort(l, l + n);
    Line q[N];
    Point p[N];
    int h = 0, t = 0, k = 0;
    q[t++] = l[0];
    for (int i = 1; i < n; i++)
    {
        if (sgn(l[i].angle() - l[i - 1].angle()) == 0) continue;
        while (h < t - 1 && l[i].relation(q[t - 1].crosspoint(q[t - 2])) == 2) t--;
        while (h < t - 1 && l[i].relation(q[h].crosspoint(q[h + 1])) == 2) h++;
        q[t++] = l[i];
    }
    while (h < t - 1 && l[h].relation(q[t - 1].crosspoint(q[t - 2])) == 2) t--;
    q[t++] = q[h];
    for (int i = h; i < t - 1; i++) p[k++] = q[i].crosspoint(q[i + 1]);
    for (int i = 1; i < k - 1; i++) res += (p[i] - p[0]) ^ (p[i + 1] - p[0]);
    return res / 2;
}
//`水平可见直线 从上向下看输出能看见哪些直线`
void half_plane2(Line l[], int n)
{
    sort(l, l + n);
    Line q[N];
    int h = 0, t = 0, k = 0;
    q[t++] = l[0];
    for (int i = 1; i < n; i++)
    {
        if (sgn(l[i].angle() - l[i - 1].angle()) == 0) continue;
        while (h < t - 1 && l[i].relation(q[t - 1].crosspoint(q[t - 2])) == 2) t--;
        // while(h<t-1&&l[i].relation(q[h].crosspoint(q[h+1]))==2) h++;
        q[t++] = l[i];
    }
    int ans[N];
    for (int i = h; i < t; i++)
        // for(auto j:q[i].id) ans[k++]=j;
    sort(ans, ans + k);
    cout << k << endl;
    for (int i = 0; i < k; i++) cout << ans[i] << " ";
}
//`多边形内核`
bool half_plane3(Line l[], int n)
{
    sort(l, l + n);
    Line q[N];
    int h = 0, t = 0;
    q[t++] = l[0];
    for (int i = 1; i < n; i++)
    {
        if (sgn(l[i].angle() - l[i - 1].angle()) == 0) continue;
        while (h < t - 1 && l[i].relation(q[t - 1].crosspoint(q[t - 2])) == 2) t--;
        while (h < t - 1 && l[i].relation(q[h].crosspoint(q[h + 1])) == 2) h++;
        q[t++] = l[i];
    }
    while (h < t - 1 && l[h].relation(q[t - 1].crosspoint(q[t - 2])) == 2) t--;
    return t - h >= 3;
}
//`最小圆覆盖`
circle increment(Point p[], int n)
{
    random_shuffle(p, p + n);
    circle ans;
    ans.p = p[0], ans.r = 0;
    for (int i = 1; i < n; i++)
        if (ans.r < ans.p.distance(p[i]))
        {
            ans.p = p[i], ans.r = 0;
            for (int j = 0; j < i; j++)
                if (ans.r < ans.p.distance(p[j]))
                {
                    ans.p = (p[i] + p[j]) / 2, ans.r = p[i].distance(p[j]) / 2;
                    for (int k = 0; k < j; k++)
                        if (ans.r < ans.p.distance(p[k]))
                        {
                            Point p1 = (p[i] + p[j]) / 2;
                            Point v1 = (p[i] - p[j]).rotright();
                            Point p2 = (p[i] + p[k]) / 2;
                            Point v2 = (p[i] - p[k]).rotright();
                            ans.p = Line(p1, p1 + v1).crosspoint(Line(p2, p2 + v2));
                            ans.r = ans.p.distance(p[i]);
                        }
                }
        }
    return ans;
}
//`自适应辛普森积分`
inline double f(double x)
{ // 积分函数
    return x;
}
double simpson(double l, double r)
{ // 辛普森公式
    double mid = (l + r) / 2;
    return (r - l) * (f(l) + f(r) + 4 * f(mid)) / 6;
}
double asr(double l, double r, double ans)
{ // 自适应
    double mid = (l + r) / 2;
    double a = simpson(l, mid), b = simpson(mid, r);
    if (sgn(a + b - ans) == 0) return ans;
    return asr(l, mid, a) + asr(mid, r, b);
}

struct Point3
{
    double x, y, z;
    //Point3(){}
    Point3(double _x=0, double _y=0, double _z=0) { x = _x;y = _y;z = _z; }
    void input() { cin>>x>>y>>z; }
    bool operator==(const Point3 &b) const {return sgn(x-b.x)==0&&sgn(y-b.y)==0&&sgn(z-b.z)==0;}
    bool operator<(const Point3 &b) const {return sgn(x-b.x)==0?(sgn(y-b.y)==0?sgn(z-b.z)<0:y<b.y):x<b.x;}
    double len() { return sqrt(x * x + y * y + z * z); }
    double len2() { return x * x + y * y + z * z; }
    double distance(const Point3 &b) const {return sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(z-b.z)*(z-b.z));}
    Point3 operator-(const Point3 &b) const { return Point3(x - b.x, y - b.y, z - b.z); }
    Point3 operator+(const Point3 &b) const { return Point3(x + b.x, y + b.y, z + b.z); }
    Point3 operator*(const double &k) const { return Point3(x * k, y * k, z * k); }
    Point3 operator/(const double &k) const { return Point3(x / k, y / k, z / k); }
    // 点乘
    double operator*(const Point3 &b) const { return x * b.x + y * b.y + z * b.z; }
    // 叉乘
    Point3 operator^(const Point3 &b) const {return Point3(y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x);}
    double rad(Point3 a, Point3 b)
    {
        Point3 p = (*this);
        return acos(((a - p) * (b - p)) / (a.distance(p) * b.distance(p)));
    }
    //`化为长度为r的向量`
    Point3 trunc(double r)
    {
        double l = len();
        if (!sgn(l)) return *this;
        r /= l;
        return Point3(x * r, y * r, z * r);
    }
};

struct Line3
{
    Point3 s, e;
    Line3() {}
    Line3(Point3 _s, Point3 _e) { s = _s;e = _e; }
    bool operator==(const Line3 v) { return (s == v.s) && (e == v.e); }
    void input() { s.input();e.input(); }
    double length() { return s.distance(e); }
    // 点到直线距离
    double dispointtoline(Point3 p) { return ((e - s) ^ (p - s)).len() / s.distance(e); }
    // 点到线段距离
    double dispointtoseg(Point3 p)
    {
        if (sgn((p - s) * (e - s)) < 0 || sgn((p - e) * (s - e)) < 0) return min(p.distance(s), e.distance(p));
        return dispointtoline(p);
    }
    //`返回点p在直线上的投影`
    Point3 lineprog(Point3 p) { return s + (((e - s) * ((e - s) * (p - s))) / ((e - s).len2())); }
    //`p绕此向量逆时针arg角度`
    Point3 rotate(Point3 p, double ang)
    {
        if (sgn(((s - p) ^ (e - p)).len()) == 0) return p;
        Point3 f1 = (e - s) ^ (p - s);
        Point3 f2 = (e - s) ^ (f1);
        double len = ((s - p) ^ (e - p)).len() / s.distance(e);
        f1 = f1.trunc(len);
        f2 = f2.trunc(len);
        Point3 h = p + f2;
        Point3 pp = h + f1;
        return h + ((p - h) * cos(ang)) + ((pp - h) * sin(ang));
    }
    //`点在直线上`
    bool pointonseg(Point3 p) { return sgn(((s - p) ^ (e - p)).len()) == 0 && sgn((s - p) * (e - p)) == 0; }
};

struct Plane
{
    Point3 a, b, c, o; //`平面上的三个点,以及法向量`
    Plane() {}
    Plane(Point3 _a, Point3 _b, Point3 _c)
    {
        a = _a;b = _b;c = _c;
        o = pvec();
    }
    Point3 pvec() { return (b - a) ^ (c - a); }
    //`ax+by+cz+d = 0`
    Plane(double _a, double _b, double _c, double _d)
    {
        o = Point3(_a, _b, _c);
        if (sgn(_a) != 0) a = Point3((-_d - _c - _b) / _a, 1, 1);
        else if (sgn(_b) != 0) a = Point3(1, (-_d - _c - _a) / _b, 1);
        else if (sgn(_c) != 0) a = Point3(1, 1, (-_d - _a - _b) / _c);
    }
    //`点在平面上的判断`
    bool pointonplane(Point3 p) { return sgn((p - a) * o) == 0; }
    //`两平面夹角`
    double angleplane(Plane f) { return acos(o * f.o) / (o.len() * f.o.len()); }
    //`平面和直线的交点,返回值是交点个数`
    int crossline(Line3 u, Point3 &p)
    {
        double x = o * (u.e - a);
        double y = o * (u.s - a);
        double d = x - y;
        if (sgn(d) == 0) return 0;
        p = ((u.s * x) - (u.e * y)) / d;
        return 1;
    }
    //`点到平面最近点(也就是投影)`
    Point3 pointtoplane(Point3 p)
    {
        Line3 u = Line3(p, p + o);
        crossline(u, p);
        return p;
    }
    //`平面和平面的交线`
    int crossplane(Plane f, Line3 &u)
    {
        Point3 oo = o ^ f.o;
        Point3 v = o ^ oo;
        double d = fabs(f.o * v);
        if (sgn(d) == 0) return 0;
        Point3 q = a + (v * (f.o * (f.a - a)) / d);
        u = Line3(q, q + oo);
        return 1;
    }
};

struct CH3D
{
    struct face
    {
        int a, b, c; // 表示凸包一个面上的三个点的编号
        bool ok;     // 表示该面是否属于最终的凸包上的面
    };
    int n;// 初始顶点数
    Point3 P[N];
    int num;// 凸包表面的三角形数
    face F[8 * N];// 凸包表面的三角形
    int g[N][N];
    void input(int _n)
    {
        n = _n;
        for (int i = 0; i < n; i++) P[i].input();
    }
    // 叉乘
    Point3 cross(const Point3 &a, const Point3 &b, const Point3 &c) { return (b - a) ^ (c - a); }
    //`三角形面积*2`
    double area(Point3 a, Point3 b, Point3 c) { return ((b - a) ^ (c - a)).len(); }
    //`四面体有向面积*6`
    double volume(Point3 a, Point3 b, Point3 c, Point3 d) { return ((b - a) ^ (c - a)) * (d - a); }
    //`正:点在面同向`
    double dblcmp(Point3 &p, face &f)
    {
        Point3 p1 = P[f.b] - P[f.a];
        Point3 p2 = P[f.c] - P[f.a];
        Point3 p3 = p - P[f.a];
        return (p1 ^ p2) * p3;
    }
    void deal(int p, int a, int b)
    {
        int f = g[a][b];
        face add;
        if (F[f].ok)
        {
            if (dblcmp(P[p], F[f]) > eps) dfs(p, f);
            else
            {
                add.a = b;
                add.b = a;
                add.c = p;
                add.ok = true;
                g[p][b] = g[a][p] = g[b][a] = num;
                F[num++] = add;
            }
        }
    }
    // 递归搜索所有应该从凸包内删除的面
    void dfs(int p, int now)
    {
        F[now].ok = false;
        deal(p, F[now].b, F[now].a);
        deal(p, F[now].c, F[now].b);
        deal(p, F[now].a, F[now].c);
    }
    bool same(int s, int t)
    {
        Point3 &a = P[F[s].a];
        Point3 &b = P[F[s].b];
        Point3 &c = P[F[s].c];
        return fabs(volume(a, b, c, P[F[t].a])) < eps &&
               fabs(volume(a, b, c, P[F[t].b])) < eps &&
               fabs(volume(a, b, c, P[F[t].c])) < eps;
    }
    // 构建三维凸包
    void create()
    {
        num = 0;
        face add;
        //***********************************
        // 此段是为了保证前四个点不共面
        bool flag = true;
        for (int i = 1; i < n; i++)
        {
            if (!(P[0] == P[i]))
            {
                swap(P[1], P[i]);
                flag = false;
                break;
            }
        }
        if (flag) return;
        flag = true;
        for (int i = 2; i < n; i++)
        {
            if (((P[1] - P[0]) ^ (P[i] - P[0])).len() > eps)
            {
                swap(P[2], P[i]);
                flag = false;
                break;
            }
        }
        if (flag)  return;
        flag = true;
        for (int i = 3; i < n; i++)
        {
            if (fabs(((P[1] - P[0]) ^ (P[2] - P[0])) * (P[i] - P[0])) > eps)
            {
                swap(P[3], P[i]);
                flag = false;
                break;
            }
        }
        if (flag) return;
        //**********************************
        for (int i = 0; i < 4; i++)
        {
            add.a = (i + 1) % 4;
            add.b = (i + 2) % 4;
            add.c = (i + 3) % 4;
            add.ok = true;
            if (dblcmp(P[i], add) > 0) swap(add.b, add.c);
            g[add.a][add.b] = g[add.b][add.c] = g[add.c][add.a] = num;
            F[num++] = add;
        }
        for (int i = 4; i < n; i++)
            for (int j = 0; j < num; j++)
                if (F[j].ok && dblcmp(P[i], F[j]) > eps)
                {
                    dfs(i, j);
                    break;
                }
        int tmp = num;
        num = 0;
        for (int i = 0; i < tmp; i++)
            if (F[i].ok) F[num++] = F[i];
    }
    // 表面积
    //`测试:HDU3528`
    double area()
    {
        double res = 0;
        if (n == 3)
        {
            Point3 p = cross(P[0], P[1], P[2]);
            return p.len() / 2;
        }
        for (int i = 0; i < num; i++)
            res += area(P[F[i].a], P[F[i].b], P[F[i].c]);
        return res / 2.0;
    }
    double volume()
    {
        double res = 0;
        Point3 tmp = Point3(0, 0, 0);
        for (int i = 0; i < num; i++)
            res += volume(tmp, P[F[i].a], P[F[i].b], P[F[i].c]);
        return fabs(res / 6);
    }
    // 表面三角形个数
    int triangle() { return num; }
    // 表面多边形个数
    //`测试:HDU3662`
    int polygon()
    {
        int res = 0;
        for (int i = 0; i < num; i++)
        {
            bool flag = true;
            for (int j = 0; j < i; j++)
                if (same(i, j))
                {
                    flag = 0;
                    break;
                }
            res += flag;
        }
        return res;
    }
    // 重心
    //`测试:HDU4273`
    Point3 barycenter()
    {
        Point3 ans = Point3(0, 0, 0);
        Point3 o = Point3(0, 0, 0);
        double all = 0;
        for (int i = 0; i < num; i++)
        {
            double vol = volume(o, P[F[i].a], P[F[i].b], P[F[i].c]);
            ans = ans + (((o + P[F[i].a] + P[F[i].b] + P[F[i].c]) / 4.0) * vol);
            all += vol;
        }
        ans = ans / all;
        return ans;
    }
    // 点到面的距离
    //`测试:HDU4273`
    double ptoface(Point3 p, int i)
    {
        double tmp1 = fabs(volume(P[F[i].a], P[F[i].b], P[F[i].c], p));
        double tmp2 = ((P[F[i].b] - P[F[i].a]) ^ (P[F[i].c] - P[F[i].a])).len();
        return tmp1 / tmp2;
    }
};

template<typename T>
inline T read()
{
    T x = 0;int f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
    return x * f;
}
void solve()
{
    double l1,l2,a1,a2;cin>>l1>>l2>>a1>>a2;
    double A=a1/180*pi,B=a2/180*pi;
    double s1=A*(l1+l2)*(l1+l2),s2=B*l2*l2;
    if(a2<=90) cout<<fixed<<setprecision(10)<<s1+s2<<endl;
    else
    {
        double l3=sqrt(l1*l1+l2*l2-2*l1*l2*cos(pi-B));
        double C=asin(l2/l3*sin(B)),D=B-C;      
        if(D<=pi/2&&B>=pi/2&&C<=pi/2)
        {
            double h=l1*l3*sin(C)/l2,s3;
            if(B-pi/2>=2*A) s3=h*l1*sin(B-pi/2)/2-h*h*A-h*h*tan(B-pi/2-2*A)/2;
            else s3=h*l1*sin(B-pi/2)/2-h*h*(B-pi/2)/2;
            cout<<fixed<<setprecision(10)<<s1+s2+2*s3<<endl;
        }
        else
        {
            if(C<=2*A)
            {
                double s3=l1*l3*sin(C)-C*l3*l3;
                cout<<fixed<<setprecision(10)<<s1+s2+s3<<endl;
            }
            else
            {
                double s3=l1*l3*sin(C)/2-A*l3*l3-sin(C-2*A)*l3*l3*sin(D)/sin(pi-D-(C-2*A))/2;
                cout<<fixed<<setprecision(10)<<s1+s2+2*s3<<endl;
            }
        }
    }
}

int main()
{
    //ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1; cin >> t;
    while (t--) solve();
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 4152kb

input:

5
2 1 20 20
3 3 0 0
20 20 90 120
20 10 50 170
100 10 1 93

output:

3.4906585040
0.0000000000
3367.1576119065
1098.8632789841
373.9604895701

result:

ok 5 numbers

Test #2:

score: 0
Accepted
time: 139ms
memory: 4220kb

input:

100000
88 12 24 116
79 15 84 150
96 52 31 141
100 100 81 29
83 29 71 99
95 92 5 87
99 97 39 72
79 72 20 65
67 39 60 116
100 89 1 62
78 77 63 45
62 34 83 178
92 49 24 103
94 73 66 49
20 14 24 51
100 97 66 109
94 94 86 82
82 79 49 67
76 38 88 118
92 79 58 112
93 23 40 167
87 34 13 25
96 18 73 15
94 38...

output:

4526.9916132029
13636.4792654743
19433.1705026127
61610.1225953998
17006.2337269873
15903.6670369751
37972.6398434501
13840.1119024646
14968.8045203183
9194.7959252341
31073.4929366566
16982.1207432264
12675.9304201947
36683.2429519542
658.6872597027
62718.1972157592
65696.5666928493
29465.974882399...

result:

ok 100000 numbers

Test #3:

score: 0
Accepted
time: 140ms
memory: 4356kb

input:

100000
1 1 0 0
1 1 0 1
1 1 0 2
1 1 0 3
1 1 0 4
1 1 0 5
1 1 0 6
1 1 0 7
1 1 0 8
1 1 0 9
1 1 0 10
1 1 0 11
1 1 0 12
1 1 0 13
1 1 0 14
1 1 0 15
1 1 0 16
1 1 0 17
1 1 0 18
1 1 0 19
1 1 0 20
1 1 0 21
1 1 0 22
1 1 0 23
1 1 0 24
1 1 0 25
1 1 0 26
1 1 0 27
1 1 0 28
1 1 0 29
1 1 0 30
1 1 0 31
1 1 0 32
1 1 0 ...

output:

0.0000000000
0.0174532925
0.0349065850
0.0523598776
0.0698131701
0.0872664626
0.1047197551
0.1221730476
0.1396263402
0.1570796327
0.1745329252
0.1919862177
0.2094395102
0.2268928028
0.2443460953
0.2617993878
0.2792526803
0.2967059728
0.3141592654
0.3316125579
0.3490658504
0.3665191429
0.3839724354
0...

result:

ok 100000 numbers

Test #4:

score: 0
Accepted
time: 139ms
memory: 4408kb

input:

100000
1 1 0 0
1 1 0 1
1 1 0 2
1 1 0 3
1 1 0 4
1 1 0 5
1 1 0 6
1 1 0 7
1 1 0 8
1 1 0 9
1 1 0 10
1 1 0 11
1 1 0 12
1 1 0 13
1 1 0 14
1 1 0 15
1 1 0 16
1 1 0 17
1 1 0 18
1 1 0 19
1 1 0 20
1 1 0 21
1 1 0 22
1 1 0 23
1 1 0 24
1 1 0 25
1 1 0 26
1 1 0 27
1 1 0 28
1 1 0 29
1 1 0 30
1 1 0 31
1 1 0 32
1 1 0 ...

output:

0.0000000000
0.0174532925
0.0349065850
0.0523598776
0.0698131701
0.0872664626
0.1047197551
0.1221730476
0.1396263402
0.1570796327
0.1745329252
0.1919862177
0.2094395102
0.2268928028
0.2443460953
0.2617993878
0.2792526803
0.2967059728
0.3141592654
0.3316125579
0.3490658504
0.3665191429
0.3839724354
0...

result:

ok 100000 numbers

Test #5:

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

input:

1
1 1 0 0

output:

0.0000000000

result:

ok found '0.0000000', expected '0.0000000', error '-0.0000000'

Test #6:

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

input:

100000
2 1 24 89
3 1 76 68
2 2 52 144
3 3 4 2
2 2 86 44
3 2 87 123
3 2 2 53
3 1 50 172
3 3 86 156
2 2 46 1
3 3 74 71
2 2 20 104
2 2 29 86
3 3 2 30
2 2 26 178
3 2 14 108
3 3 90 69
3 2 13 175
3 3 52 35
2 2 73 31
3 3 77 105
3 1 86 143
3 3 50 109
3 1 13 94
3 2 41 139
2 2 51 154
2 1 57 40
3 3 27 112
2 2 ...

output:

5.3232542186
22.4100275956
25.1738766201
2.8274333882
27.0875099910
47.0128860698
4.5727626402
17.1015256593
80.1688642414
12.9154364648
57.6482251934
12.8643846364
14.1022603561
5.9690260418
19.8188656721
13.7360708610
67.3871624195
18.2334376566
38.1703507411
22.5496539358
64.9255289092
26.9271291...

result:

ok 100000 numbers

Test #7:

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

input:

1
1 1 1 1

output:

0.0872664626

result:

ok found '0.0872665', expected '0.0872665', error '0.0000000'

Test #8:

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

input:

100000
71 6 33 34
98 20 79 171
88 16 59 8
45 21 36 79
88 61 44 149
55 47 72 86
81 8 85 122
68 2 35 71
98 91 79 49
73 19 68 148
69 66 81 22
99 94 87 130
65 53 43 53
97 89 84 1
93 88 77 6
83 46 2 51
83 69 46 95
91 55 17 137
93 84 1 54
61 45 74 15
77 65 0 21
84 71 6 32
87 81 37 76
91 55 32 154
73 34 76...

output:

3436.2216846190
20453.8997142210
11173.4582449275
3345.0107779097
27858.1254430274
16389.7237803630
11913.3689208264
2998.1964022459
56334.4809588115
11128.1167240823
27437.5706790245
77419.2591702800
13048.2385675423
50858.6326037270
44838.5731345780
2464.3699972310
26444.6360922972
14434.015080374...

result:

ok 100000 numbers

Test #9:

score: 0
Accepted
time: 172ms
memory: 4276kb

input:

100000
10 1 40 160
6 6 27 16
10 10 7 41
4 1 38 161
7 6 66 143
6 4 26 127
8 4 47 99
4 4 49 121
5 2 68 122
8 8 27 178
10 8 73 125
6 2 20 175
10 1 34 13
7 4 66 102
10 10 14 179
9 7 64 120
7 5 47 169
10 8 68 90
8 2 37 3
5 5 10 164
4 2 26 62
7 5 43 40
1 1 35 103
10 7 71 102
6 1 90 63
6 4 49 44
6 3 84 123...

output:

87.5849133579
77.9114978090
120.4277183876
19.6909239887
291.6581829250
83.3184895803
145.8513632372
89.2261953793
67.6719994426
321.5712287284
558.4265731546
34.9039348265
72.0297382298
168.0119006372
411.8275152924
391.8455078997
196.2804721879
485.0619057143
64.7866218340
92.3584692325
20.6646983...

result:

ok 100000 numbers

Test #10:

score: 0
Accepted
time: 136ms
memory: 4404kb

input:

100000
8 8 89 18
10 1 17 44
6 1 43 5
11 10 84 74
11 11 64 172
10 7 85 51
7 6 71 176
9 7 51 99
5 3 12 54
6 5 26 32
3 2 21 23
10 10 59 151
9 9 81 45
7 4 2 37
11 6 3 172
11 10 65 98
11 10 78 173
7 2 9 104
10 9 46 77
8 3 24 100
11 9 77 41
10 10 55 30
11 6 37 75
9 7 25 56
10 9 14 7
9 9 12 179
11 9 6 130
...

output:

417.7620097574
36.6693675844
36.8613538021
775.6941327564
917.1929866143
472.3559087597
322.4645901228
312.6392121697
21.8864288200
68.8706922837
10.7686814848
692.8212327322
521.6614601286
14.5560459616
127.7263969814
671.4494073483
913.4668883144
20.2138463713
398.6855610331
66.5036820653
595.5237...

result:

ok 100000 numbers

Test #11:

score: 0
Accepted
time: 139ms
memory: 4216kb

input:

100000
7 3 55 160
4 3 14 72
9 7 4 52
9 9 31 71
12 1 87 116
9 7 10 154
12 10 20 100
6 5 61 69
12 12 55 130
12 11 7 163
4 3 43 178
11 11 42 155
12 1 20 1
5 3 72 151
7 2 74 136
10 10 66 76
11 11 84 176
8 6 59 110
12 2 54 47
12 12 38 28
12 12 38 105
12 12 60 173
12 4 48 76
2 1 71 31
3 1 21 123
12 7 83 2...

output:

123.8481688417
23.2826922216
62.3431608812
275.6747553525
258.9925308538
187.4182443373
343.7313507612
158.9296816866
891.5581093363
425.5736015515
65.0474040238
703.9554219390
59.0095820099
107.1528554271
115.7908511816
593.4119456781
1088.8025991771
271.7872108174
188.0068670248
452.3893421169
646...

result:

ok 100000 numbers

Test #12:

score: 0
Accepted
time: 125ms
memory: 4464kb

input:

100000
12 8 12 17
7 1 3 24
13 13 40 16
9 9 77 68
11 1 2 137
8 5 43 153
11 10 60 93
9 4 54 124
13 11 90 62
13 11 23 10
9 5 65 152
13 10 81 159
9 5 0 100
2 1 8 10
13 4 29 108
11 9 33 62
1 1 7 0
7 6 9 117
10 7 79 17
6 3 44 136
9 1 89 169
12 12 90 59
11 11 67 48
8 2 50 165
12 3 36 39
11 2 46 157
12 7 57...

output:

102.7649863574
3.7699111843
519.1307327132
531.5574769874
7.8958552512
201.6594478137
624.1355207458
197.8859939115
1035.7132847185
252.3397032533
297.2487707899
1051.6114311879
43.6332312999
1.4311699866
178.0801014882
318.0338962984
0.4886921906
101.4983431688
413.0147141919
86.5755164858
158.4706...

result:

ok 100000 numbers

Test #13:

score: 0
Accepted
time: 180ms
memory: 4488kb

input:

100000
16 6 41 45
19 4 51 119
1 1 20 49
20 20 68 30
20 20 56 133
16 6 69 27
13 12 17 12
11 6 33 146
12 9 51 156
7 7 6 125
20 17 76 123
20 13 14 80
20 20 50 160
10 9 89 177
13 4 0 61
18 4 65 36
10 5 34 167
17 15 73 74
18 1 26 107
17 8 6 65
10 5 14 130
19 6 51 73
11 1 75 177
14 3 76 96
8 3 31 9
7 5 13...

output:

374.6174706481
509.2284554272
2.2514747351
2108.3577364091
2531.2743370122
599.8347573254
215.6005224989
270.9268661372
635.7110655017
129.6061759140
2456.9872192211
502.0614126287
2584.6655180164
815.1520058325
17.0344134995
559.1336791689
211.6815884571
1595.2658429079
165.9307956533
138.055543832...

result:

ok 100000 numbers

Test #14:

score: 0
Accepted
time: 127ms
memory: 4492kb

input:

100000
21 19 6 6
17 6 48 147
16 10 56 89
18 18 89 19
19 18 79 85
15 7 12 18
20 18 57 117
17 16 36 117
9 6 12 81
20 19 4 76
19 18 7 97
21 2 79 160
21 19 5 4
21 19 25 119
14 10 54 129
21 17 49 21
21 13 48 179
14 14 31 80
18 17 51 1
8 4 37 1
13 9 90 118
14 14 47 64
16 11 3 74
20 15 30 42
19 19 38 133
1...

output:

205.3554397897
550.0648678780
816.0461450625
2120.5750411731
2368.2547153236
116.7625269584
2110.3231779301
1215.7841712539
98.0176907920
585.0343652685
715.9944571208
741.8350733032
164.8288945583
1464.1555389874
783.2976070290
1340.8491978446
1499.3758820076
697.8524481174
1095.4384517217
93.27039...

result:

ok 100000 numbers

Test #15:

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

input:

100000
14 12 55 44
19 19 55 175
18 18 25 53
18 12 61 16
22 19 85 30
21 17 53 122
22 22 80 110
20 17 46 87
19 11 64 165
5 1 20 110
19 6 46 176
22 22 45 164
22 18 77 35
22 4 69 53
17 2 34 93
22 17 33 179
16 12 79 106
17 17 64 87
22 16 60 76
12 4 43 109
18 10 51 174
11 8 60 26
19 17 5 46
14 12 75 101
2...

output:

759.4974772979
2516.0276064942
865.1946167986
998.3981453108
2682.8328597031
1972.1516298802
3638.7491158929
1537.9317769798
1382.2181528800
14.6898172090
614.8675823021
2986.6507444780
2348.1659756332
828.8917683571
220.7281428869
1783.9488861412
1349.1665831826
1730.0925276244
1851.7245231959
224....

result:

ok 100000 numbers

Test #16:

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

input:

100000
22 20 49 129
22 1 9 42
29 27 41 134
29 29 72 80
27 16 71 123
28 7 21 71
25 13 70 133
28 11 27 60
29 28 68 3
23 5 1 168
27 22 79 16
29 10 17 81
27 15 90 119
29 28 86 79
22 21 69 122
27 27 49 139
16 8 11 97
16 11 4 58
12 11 32 128
18 8 35 146
29 22 27 19
30 15 50 115
15 2 24 72
18 6 80 158
13 6...

output:

2446.9221491553
83.8281639733
4035.0701226749
5401.5845954122
2878.4814120381
509.7059547524
2207.4158578307
843.4652676113
3897.0409670230
91.3684402917
3445.6813691648
592.6614540997
3265.0553099501
5957.6814016826
3188.8309213006
4354.9676823937
219.0883237022
173.3810078931
576.3227095244
600.60...

result:

ok 100000 numbers

Test #17:

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

input:

100000
39 35 57 118
18 2 33 138
37 28 62 114
40 2 11 130
11 9 78 113
23 17 47 122
29 7 65 143
36 27 11 77
24 19 77 38
34 30 5 12
12 2 74 14
38 31 37 82
36 34 15 85
39 27 17 161
37 15 46 80
40 14 33 54
37 30 88 95
40 22 9 111
36 36 12 52
40 40 48 151
40 39 41 163
21 16 42 73
18 2 64 146
40 37 84 152
...

output:

8021.6129252429
241.9100912874
6161.9004642895
349.6471069489
706.6558630426
1953.1039104538
1613.9959824690
1741.6989671502
2724.3018827305
545.9389900238
254.1199390904
4449.8740075922
2997.7775232255
3534.1587471804
2485.0696021596
1864.2210806402
8387.1674435733
1565.5957228019
2261.9467105847
9...

result:

ok 100000 numbers

Test #18:

score: 0
Accepted
time: 149ms
memory: 4404kb

input:

100000
9 8 74 2
47 41 64 61
42 1 75 10
33 29 33 75
43 1 76 103
48 12 73 90
50 50 35 160
50 48 13 179
49 46 77 169
30 18 74 55
44 43 77 164
15 2 31 91
49 43 31 120
49 36 39 131
43 8 23 142
33 31 25 74
25 6 58 129
28 20 31 95
8 7 1 148
37 10 52 156
11 5 54 52
49 26 33 2
20 17 13 33
38 23 89 34
50 7 60...

output:

375.4901352741
10439.8090938517
2420.5098731283
3314.8514884353
2570.0101069111
4812.9199452996
13536.1656096110
9417.1108767373
18693.8565477547
3286.7342341856
15787.4617963132
162.7174448338
8548.7942509624
8091.2507086034
1231.6104293582
3028.3905983054
1068.3169861962
1909.9819629417
131.987563...

result:

ok 100000 numbers

Test #19:

score: 0
Accepted
time: 204ms
memory: 4372kb

input:

100000
985040437 963837006 74 178
562320397 456498961 21 57
616458849 43215539 12 112
967049313 962181597 55 20
404875500 323494205 16 148
822013814 350801410 65 117
493753261 325808227 72 151
883524417 55981080 1 165
756475575 306464991 75 65
982861539 971158777 53 2
977914232 494619050 34 80
92912...

output:

7823031139236864000.0000000000
587759779770854528.0000000000
95369829970997632.0000000000
3895961013788279808.0000000000
443752067877684928.0000000000
1832058841745101824.0000000000
1157411971581695232.0000000000
25211463877824920.0000000000
1585510323477645056.0000000000
3564846423752922112.0000000...

result:

ok 100000 numbers

Test #20:

score: 0
Accepted
time: 256ms
memory: 4396kb

input:

100000
915624482 436335283 31 93
966989692 899762255 14 172
971565321 859650888 86 78
840892426 595383046 16 116
992919354 525701445 9 98
924698821 417910701 18 49
923077550 641792877 68 62
918753914 850646822 29 137
935549247 897719522 87 46
937380829 805246200 55 11
434960395 174040501 0 56
902102...

output:

1298002666918420224.0000000000
3375253522633562112.0000000000
6039368287407980544.0000000000
1313133658442171648.0000000000
835838455087290112.0000000000
715665701891950336.0000000000
3352034067230078464.0000000000
3413794084111542784.0000000000
5750292420404998144.0000000000
3039557717337095168.000...

result:

ok 100000 numbers