QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#639191#6599. The Grand TournamentasitshouldbeAC ✓266ms4444kbC++1730.7kb2024-10-13 18:14:222024-10-13 18:14:22

Judging History

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

  • [2024-10-13 18:14:22]
  • 评测
  • 测评结果:AC
  • 用时:266ms
  • 内存:4444kb
  • [2024-10-13 18:14:22]
  • 提交

answer

#include <bits/stdc++.h>
#define pi acos(-1.0)
//#define double long double
using namespace std;
const double eps = 1e-9,inf=1e12;
const int N=1e3+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);}
    int 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 check(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 0; 
        bool f=(d1==0&&sgn((v.s-s)*(v.s-e))<=0)||(d2==0 && sgn((v.e-s)*(v.e-e))<=0)||(d3==0 && sgn((s-v.s)*(s-v.e))<=0) ||(d4==0 && sgn((e-v.s)*(e-v.e))<=0);
        if(!f) return 0;
        if(e==v.e&&s==v.s) return 1; //完全重合
        if(e==v.e||e==v.s||s==v.e||s==v.s)
        {
            if((*this).parallel(v))
            {
                if(e==v.e&&((*this).pointonseg(v.s)||v.pointonseg(s))) return 3;//端点重合部分重合
                if(e==v.s&&((*this).pointonseg(v.e)||v.pointonseg(s))) return 3;
                if(s==v.e&&((*this).pointonseg(v.s)||v.pointonseg(e))) return 3;
                if(s==v.s&&((*this).pointonseg(v.e)||v.pointonseg(e))) return 3;
                else return 0;
            }
            return 2; //端点重合 
        }
        int a1=(*this).pointonseg(v.s);
        int a2=(*this).pointonseg(v.e);
        int a3=v.pointonseg(e);
        int a4=v.pointonseg(s);
        if((a1||a2)&&(a3||a4)) return 4;
        if(a1&&a2) return 4;
        if(a3&&a4) return 4;
        return 0;
        // if(a1+a2+a3+a4==1) return 0;
        // return 4;
    }
    //`直线和线段相交判断`
    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];
        int len = 0;
        q[len++] = a;
        Line l(a,b);
        Point p1,p2;
        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 点上`
        }
        getline();
        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){
        getline();
        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=0;i<k;i++) cout<<p[i].x<<" "<<p[i].y<<endl;
    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);
}

void solve(int cnt)
{
    double xl,yl,xr,yr;
    cin>>xl>>yl>>xr>>yr;
    Line l1,l2,l[N];
    l1.input(),l2.input();
    l1.adjust(),l2.adjust();
    int t=l1.check(l2);
    double res=0;
    l[0]=Line(Point(xl,yl),Point(xr,yl));
    l[1]=Line(Point(xr,yl),Point(xr,yr));
    l[2]=Line(Point(xr,yr),Point(xl,yr));
    l[3]=Line(Point(xl,yr),Point(xl,yl));
    //cout<<t<<" ";
    //if(cnt==23) cout<<l2.e.y;
    if(t==1) res=(xr-xl)*(yr-yl);
    else if(t==3)
    {
        if(sgn(l1.length()-l2.length())>0) swap(l1,l2);
        if(l1.s==l2.s) l[4]=Line(l1.e,l2.e.rotate(l1.e,pi/2));
        else if(l1.e==l2.e) l[4]=Line(l1.s,l2.s.rotate(l1.s,pi/2));
        res=half_plane1(l,5);
    }
    else if(t==4)
    {
        if(l2.s<l1.s) swap(l1,l2);
        if(l2.e<l1.e)
        {
            l[4]=Line(l2.s,l1.s.rotate(l2.s,pi/2));
            l[5]=Line(l2.e,l1.e.rotate(l2.e,pi/2));
        }
        else
        {
            l[4]=Line(l2.s,l1.s.rotate(l2.s,pi/2));
            l[5]=Line(l1.e,l2.e.rotate(l1.e,pi/2));
        }
        res=half_plane1(l,6);
    }
    else if(t==2)
    {      
        if(l1.s==l2.s)
        {
            //if(l1.e.y<l2.e.y) swap(l1,l2);
            l[4]=Line(l1.s,l1.e.rotate(l1.s,pi/2));
            l[5]=Line(l2.s,l2.e.rotate(l2.s,pi/2));
        }
        else if(l1.e==l2.e)
        {
            //if(l1.s.y<l2.s.y) swap(l1,l2);
            l[4]=Line(l1.e,l1.s.rotate(l1.e,pi/2));
            l[5]=Line(l2.e,l2.s.rotate(l2.e,pi/2));
        }
        else if(l1.s==l2.e)
        {
            //if(l1.e.y<l2.s.y) swap(l1,l2);
            l[4]=Line(l1.s,l1.e.rotate(l1.s,pi/2));
            l[5]=Line(l2.e,l2.s.rotate(l2.e,pi/2));
        }
        else
        {
            //if(l1.s.y<l2.e.y) swap(l1,l2);
            l[4]=Line(l1.e,l1.s.rotate(l1.e,pi/2));
            l[5]=Line(l2.s,l2.e.rotate(l2.s,pi/2));
        }
        // cout<<l[4].s.x<<" "<<l[4].s.y<<endl;
        // cout<<l[4].e.x<<" "<<l[4].e.y<<endl;
        // cout<<l[5].s.x<<" "<<l[5].s.y<<endl;
        // cout<<l[5].e.x<<" "<<l[5].e.y<<endl;
        res=half_plane1(l,6);
    }
    cout<<fixed<<setprecision(10)<<res<<endl;
}

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t=1; cin>>t;
    for(int i=1;i<=t;i++) solve(i);
    return 0;
}

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

詳細信息

Test #1:

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

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.0000000000
1.0000000000

result:

ok 2 numbers

Test #2:

score: 0
Accepted
time: 0ms
memory: 4368kb

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.0000000000
3.7500000000
0.0000000000
6.0000000000
0.0000000000
0.0000000000
0.0000000000
6.0000000000
2.0000000000
4.0000000000

result:

ok 10 numbers

Test #3:

score: 0
Accepted
time: 202ms
memory: 4340kb

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.0000000000
42.0000000000
12.0000000000
24.0000000000
25.0000000000
28.0000000000
99.0000000000
0.0000000000
135.0000000000
6.0000000000
42.0000000000
45.0000000000
120.0000000000
8.0000000000
84.0000000000
15.0000000000
16.0000000000
0.0000000000
36.0000000000
4.0000000000
0.5000000000
20.00000000...

result:

ok 100000 numbers

Test #4:

score: 0
Accepted
time: 266ms
memory: 4176kb

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.0000000000
126.0000000000
468.0000000000
300.0000000000
29.5900621118
190.6666666667
75.0000000000
0.0000000000
323.0000000000
0.0000000000
0.0000000000
18.0000000000
0.0000000000
141.2894736842
29.3076923077
21.0000000000
7.7500000000
20.0000000000
3.1000000000
144.0000000000
1.5833333333
0.0000...

result:

ok 100000 numbers

Test #5:

score: 0
Accepted
time: 234ms
memory: 4360kb

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.4444444444
369.0000000000
106.2857142857
25.0000000000
5.6000000000
0.0000000000
32.0000000000
216.0000000000
0.0000000000
99.9000000000
0.0000000000
6.0000000000
276.6500000000
0.0000000000
462.0000000000
42.0000000000
0.0000000000
0.0000000000
1710.0000000000
0.0000000000
50.0000000000
245.00000...

result:

ok 100000 numbers

Test #6:

score: 0
Accepted
time: 220ms
memory: 4240kb

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.0000000000
0.0000000000
1265.6470588235
1482.5647865854
2604.0000000000
528.0000000000
384.0000000000
481.6307692308
0.0000000000
490.0000000000
70.0000000000
0.0000000000
16.0000000000
270.0000000000
597.4545454545
288.0000000000
0.0000000000
1206.6250000000
512.0000000000
1.0763888889
1458.00...

result:

ok 100000 numbers

Test #7:

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

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.6149732620
0.0000000000
3751.0000000000
715.0000000000
9020.0000000000
0.0000000000
14300.0000000000
16364.2741935484
50801.4838709677
16.0000000000
0.0000000000
2493.6363636364
280.6607142857
44.0000000000
185.0000000000
935.0000000000
9.4659090909
56.0000000000
4726.0000000000
437.1000000000
466...

result:

ok 100000 numbers

Test #8:

score: 0
Accepted
time: 219ms
memory: 4444kb

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.0000000000
0.0000000000
5425.0000000000
980.0000000000
0.0000000000
4692.4705882353
651.0000000000
560.0000000000
21645.0000000000
1013.2467850582
32053.0000000000
96819.0000000000
31937.1755890762
168.0000000000
260.0000000000
2398.3780487805
8256.0000000000
0.0000000000
0.0000000000
14500.30...

result:

ok 100000 numbers

Test #9:

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

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.0000000000
0.0000000000
0.0000000000
18936.4444444444
0.0000000000
1016880.0000000000
602.1705458741
509410.0000000000
0.0000000000
177747.8083832335
240642.3387096774
369120.7786144579
0.0000000000
538241.0000000000
0.0000000000
0.0000000000
0.0000000000
257258.7829787234
339529.6515789473
477372...

result:

ok 100000 numbers

Test #10:

score: 0
Accepted
time: 227ms
memory: 4344kb

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.3093570401
3384105.0000000000
3630088.0000000000
632999.1363636360
3228717.0000000000
867642.8888888892
0.0000000000
3506074.0000000000
3256160.0000000000
3230766.0000000000
3144390.0000000000
3487424.0000000000
0.0000000000
0.0000000000
2231056.0000000000
3827620.0000000000
2734851.41414444...

result:

ok 100000 numbers

Test #11:

score: 0
Accepted
time: 241ms
memory: 4368kb

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.0000000000
0.0000000000
0.0000000000
3964077.0000000000
1687977.2432795700
3984012.0000000000
1186.8072701490
3769116.0000000000
3972033.0000000000
2145411.9341637008
0.0000000000
2031273.5632183910
769194.2585470087
1829984.5090909088
2233806.7532097008
3958054.0000000000
164249.7130102041
205535...

result:

ok 100000 numbers

Test #12:

score: 0
Accepted
time: 228ms
memory: 4332kb

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.0000000000
15.0000000000
30.0000000000
55.0000000000
0.0000000000
18.0000000000
0.6666666667
9.0000000000
0.0000000000
11.3750000000
1.2500000000
15.0000000000
352.0000000000
0.0000000000
0.0000000000
80.0000000000
0.0000000000
12.0000000000
56.0000000000
0.0000000000
2.5000000000
0.0000000000
4....

result:

ok 100000 numbers

Test #13:

score: 0
Accepted
time: 254ms
memory: 4360kb

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.9610389610
0.0000000000
36.0000000000
49.0000000000
60.0000000000
15.0000000000
71.5000000000
0.0000000000
40.0000000000
36.0000000000
104.0000000000
24.0000000000
12.0000000000
48.0000000000
0.0000000000
6.0000000000
12.0000000000
130.0000000000
112.0000000000
0.6000000000
88.0000000000
88.000000...

result:

ok 100000 numbers

Test #14:

score: 0
Accepted
time: 259ms
memory: 4444kb

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.0000000000
30.0000000000
3.0000000000
182.0000000000
238.0000000000
469.0000000000
3.0210526316
85.0000000000
0.0000000000
2304.0000000000
5.0000000000
48.0000000000
732.0000000000
272.0000000000
0.0000000000
0.0000000000
0.0000000000
378.0000000000
387.0000000000
12.8333333333
357.9545454545
0.0...

result:

ok 100000 numbers

Test #15:

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

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.0000000000
240.0000000000
51.0000000000
3476.0000000000
77.0000000000
8.5714285714
0.0000000000
1092.0000000000
2662.0000000000
187.8500000000
836.0000000000
960.0000000000
0.0000000000
0.0000000000
861.8000000000
2171.7142857143
12463.0000000000
0.0000000000
159.2500000000
320.0000000000
198.00...

result:

ok 100000 numbers

Test #16:

score: 0
Accepted
time: 243ms
memory: 4440kb

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.0000000000
12000.0000000000
6885.0000000000
11726.0000000000
0.0000000000
8.0000000000
612.0000000000
0.0000000000
1180.0000000000
19234.0000000000
0.0000000000
0.0000000000
0.0000000000
5896.0000000000
0.0000000000
3213.0000000000
492.0000000000
0.0000000000
0.0000000000
1838.2000000000
0.000000...

result:

ok 100000 numbers

Test #17:

score: 0
Accepted
time: 226ms
memory: 4440kb

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.3186813187
0.0000000000
8321.0000000000
261725.0000000000
36160.0000000000
0.0000000000
148708.0000000000
1048.6842105263
33420.5581395349
23546.0000000000
6453.8478070175
1156.0000000000
17.9649122807
629.7870370370
24010.8363636364
2430.0000000000
0.0000000000
3251.3062500000
1090.4000000000
55...

result:

ok 100000 numbers

Test #18:

score: 0
Accepted
time: 224ms
memory: 4348kb

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.0000000000
58.9231859375
0.0000000000
425.7427843803
0.0000000000
22400.0000000000
415800.0000000000
0.0000000000
813732.0000000000
1094143.9407744876
442188.0000000000
0.0000000000
0.0000000000
0.0000000000
62167.3398058252
1417705.4045385779
0.0000000000
495772.6810176125
0.0000000000
1947...

result:

ok 100000 numbers

Test #19:

score: 0
Accepted
time: 252ms
memory: 4184kb

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.0000000000
949771.0184049077
3672864.0000000000
504273.9310344828
910394.5194274025
2584656.0000000000
0.0000000000
3346200.0000000000
3722814.0000000000
0.0000000000
3455808.0000000000
3381192.0000000000
3000370.0000000000
0.0000000000
0.0000000000
453073.4246686301
1196461.7462932458
44668...

result:

ok 100000 numbers

Test #20:

score: 0
Accepted
time: 245ms
memory: 4288kb

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.9998797365
0.0000000000
3808322.0000000000
1470130.7832161714
3982008.0000000000
298549.5652173912
3548251.8828539290
1288381.2660803783
3876561.0000000000
0.0000000000
253343.9999999999
0.0000000000
0.0000000000
49050.5323689699
464519.0254521787
3924280.0000000000
3172778.5083701466
0.0000...

result:

ok 100000 numbers

Test #21:

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

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.0000000000
2.5000000000
30.0000000000
12.0000000000
21.0000000000
10.0000000000
9.0000000000
1.5000000000
7.0000000000
0.0000000000
18.0000000000
36.0000000000
24.0000000000
9.0000000000
5.0000000000
0.0000000000
21.0000000000
30.0000000000
12.0000000000
9.5000000000
0.0000000000
20.0000000000
10....

result:

ok 100000 numbers

Test #22:

score: 0
Accepted
time: 231ms
memory: 4336kb

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.0000000000
306.0000000000
17.5000000000
35.0000000000
144.0000000000
153.0000000000
52.0000000000
0.0000000000
0.0000000000
36.0000000000
56.0000000000
4.3750000000
0.0000000000
172.0000000000
20.0000000000
0.0000000000
161.0000000000
40.0000000000
98.8500000000
11.7166666667
112.0000000000
56.00...

result:

ok 100000 numbers

Test #23:

score: 0
Accepted
time: 244ms
memory: 4240kb

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.8333333333
2.0000000000
42.5000000000
357.0000000000
130.0000000000
156.0000000000
33.0000000000
17.3785714286
154.0000000000
36.0000000000
24.0000000000
32.0000000000
0.0000000000
8.0416666667
506.0000000000
0.0000000000
177.8967391304
26.6666666667
434.0000000000
742.0000000000
109.3750000000
3....

result:

ok 100000 numbers

Test #24:

score: 0
Accepted
time: 229ms
memory: 4436kb

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.0000000000
1123.5000000000
135.0000000000
200.0000000000
0.0000000000
218.6666666667
0.0000000000
400.0000000000
0.0000000000
2275.0000000000
1152.0000000000
54.0000000000
169.7631578947
167.1428571429
34.0000000000
2.6250000000
0.0000000000
2480.0000000000
0.0000000000
396.0000000000
2262.00000...

result:

ok 100000 numbers

Test #25:

score: 0
Accepted
time: 220ms
memory: 4336kb

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.0000000000
0.0000000000
289.5393939394
38121.0000000000
1887.0000000000
0.0000000000
3160.0000000000
204.5000000000
0.0000000000
20114.0000000000
0.0000000000
814.0000000000
397.4016666667
13585.7142857143
0.0000000000
217.6923076923
242.8571428571
0.0000000000
57528.0000000000
307.7954545455
2...

result:

ok 100000 numbers

Test #26:

score: 0
Accepted
time: 228ms
memory: 4344kb

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.0000000000
3942.0000000000
0.0000000000
0.0000000000
0.0000000000
2140.0000000000
21010.0000000000
18444.0000000000
28665.0000000000
0.0000000000
14000.0000000000
3336.0000000000
8482.5000000000
17800.0000000000
66286.0000000000
3822.0000000000
55552.0000000000
18285.0000000000
96.0000000000
134...

result:

ok 100000 numbers

Test #27:

score: 0
Accepted
time: 228ms
memory: 4384kb

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.0000000000
76751.2892228739
749523.0000000000
600522.3483535529
1714710.0000000000
1533312.0000000000
0.0000000000
0.0000000000
0.0000000000
100436.0000000000
430802.4524714829
0.0000000000
594520.0000000000
1225296.0000000000
1088724.0000000000
0.0000000000
1184592.0000000000
504000.00000000...

result:

ok 100000 numbers

Test #28:

score: 0
Accepted
time: 219ms
memory: 4364kb

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.0000000000
3701348.0000000000
3378163.0000000000
3069479.0000000000
2013508.3749999995
2423685.0000000000
0.0000000000
91400.5797173566
3743904.0000000000
700867.6977178830
370580.4588690778
0.0000000000
106662.2153029381
0.0000000000
3922368.0000000000
333909.2257925022
3710304.0000000000
1...

result:

ok 100000 numbers

Test #29:

score: 0
Accepted
time: 236ms
memory: 4196kb

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.0000000000
1542553.8451900356
3960084.0000000000
3944052.0000000000
1610389.3226047903
3894646.0000000000
3830324.0000000000
1834613.2144702841
256920.0868967181
0.0000000000
0.0000000000
3986006.0000000000
3990000.0000000000
0.0000000000
0.0000000000
3874290.0000000000
3876880.0000000000
14...

result:

ok 100000 numbers

Test #30:

score: 0
Accepted
time: 232ms
memory: 4444kb

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.0000000000
52.0000000000
3.0000000000
176.0000000000
0.0000000000
20.6333333333
35.0000000000
5.0000000000
12.0000000000
12.0000000000
90.0000000000
44.0000000000
12.0000000000
48.0000000000
15.9500000000
19.4166666667
156.0000000000
0.0000000000
0.0000000000
6.0000000000
10.0000000000
40.0000000...

result:

ok 100000 numbers

Test #31:

score: 0
Accepted
time: 225ms
memory: 4316kb

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.0000000000
2.8666666667
9.0000000000
180.0000000000
0.0000000000
154.0000000000
0.0000000000
263.5000000000
238.0000000000
374.0000000000
1242.9583333333
23.9807692308
144.0000000000
0.0000000000
0.0000000000
551.0000000000
0.0000000000
81.0000000000
310.0000000000
15.0000000000
42.0000000000
96.0...

result:

ok 100000 numbers

Test #32:

score: 0
Accepted
time: 239ms
memory: 4344kb

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.0000000000
208.2500000000
63.0000000000
23.0000000000
0.0000000000
84.0000000000
810.0000000000
0.0000000000
1860.0000000000
1656.0000000000
56.0000000000
204.0000000000
290.0000000000
1010.0000000000
13.5208333333
156.0000000000
867.0000000000
2950.0000000000
18.0000000000
0.0000000000
282.0000...

result:

ok 100000 numbers

Test #33:

score: 0
Accepted
time: 226ms
memory: 4320kb

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.0000000000
7112.0000000000
0.0000000000
0.0000000000
302.9806560135
12969.0000000000
3645.0000000000
132.0000000000
5.9548611111
29016.0000000000
0.0000000000
31987.5937500000
5022.0000000000
112.5590558091
0.0000000000
1.1250000000
5349.1750000000
7920.0000000000
0.0000000000
1360.6446644664
475....

result:

ok 100000 numbers

Test #34:

score: 0
Accepted
time: 262ms
memory: 4360kb

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.3750000000
22456.0000000000
0.0000000000
43.6294196393
3.0431034483
872.3473214286
39611.0000000000
17.0454545455
0.0000000000
5594.5753575358
0.0000000000
36295.7241379310
7812.0000000000
15811.0000000000
0.0000000000
0.0000000000
38318.9950142450
0.0000000000
0.0000000000
3822.8750000000
228...

result:

ok 100000 numbers

Test #35:

score: 0
Accepted
time: 243ms
memory: 4348kb

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.0000000000
3784860.0000000000
1580064.0305498978
739091.6029411765
899036.1238532111
66224.3522570119
0.0000000000
3430916.0000000000
2071579.1807432433
245252.3099778431
643532.4271844660
3323293.0000000000
3347344.0000000000
0.0000000000
0.0000000000
4229.3810750820
2317345.0000000000
0.00000000...

result:

ok 100000 numbers