QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#884424#9728. Catch the StarJose_17WA 181ms4096kbC++1420.6kb2025-02-06 06:25:292025-02-06 06:25:30

Judging History

This is the latest submission verdict.

  • [2025-02-06 06:25:30]
  • Judged
  • Verdict: WA
  • Time: 181ms
  • Memory: 4096kb
  • [2025-02-06 06:25:29]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
 
// Holi c:
 
//#define ll long long int
#define ii __int128
#define fi first
#define se second
#define pb push_back
#define all(v) v.begin(), v.end()

typedef long long int ll; 
 
const int Inf = 1e9;
const int Inf2 = 1e9 + 1;
const ll mod = 1e9+7;
const ll INF = 4e18;
const ll INF2 = 1e10 + 1;
 
using ld = long double;

const ld eps = 1e-9, inf = numeric_limits<ld>::max(), pi = acos(-1);

bool geq(ld a, ld b){return a-b >= -eps;}     
bool leq(ld a, ld b){return b-a >= -eps;}     
bool ge(ld a, ld b){return a-b > eps;}        
bool le(ld a, ld b){return b-a > eps;}       
bool eq(ld a, ld b){return abs(a-b) <= eps;}
bool neq(ld a, ld b){return abs(a-b) > eps;} 

struct fraccion{
	ll num, den;
	fraccion(){
		num = 0, den = 1;
	}
	fraccion(ll x, ll y){
		if(y < 0)
			x *= -1, y *=-1;
		ll d = __gcd(abs(x), abs(y));
		num = x/d, den = y/d;
	}
	fraccion(ll v){
		num = v;
		den = 1;
	}
	fraccion operator+(const fraccion& f) const{
		ll d = __gcd(den, f.den);
		return fraccion(num*(f.den/d) + f.num*(den/d), den*(f.den/d));
	}
	fraccion operator-() const{
		return fraccion(-num, den);
	}
	fraccion operator-(const fraccion& f) const{
		return *this + (-f);
	}
	fraccion operator*(const fraccion& f) const{
		return fraccion(num*f.num, den*f.den);
	}
	fraccion operator/(const fraccion& f) const{
		return fraccion(num*f.den, den*f.num);
	}
	fraccion operator+=(const fraccion& f){
		*this = *this + f;
		return *this;
	}
	fraccion operator-=(const fraccion& f){
		*this = *this - f;
		return *this;
	}
	fraccion operator++(int xd){
		*this = *this + 1;
		return *this;
	}
	fraccion operator--(int xd){
		*this = *this - 1;
		return *this;
	}
	fraccion operator*=(const fraccion& f){
		*this = *this * f;
		return *this;
	}
	fraccion operator/=(const fraccion& f){
		*this = *this / f;
		return *this;
	}
	bool operator==(const fraccion& f) const{
		ll d = __gcd(den, f.den);
		return ((ii)num*(f.den/d) == ((ii)den/d)*f.num);
	}
	bool operator!=(const fraccion& f) const{
		ll d = __gcd(den, f.den);
		return ((ii)num*(f.den/d) != ((ii)den/d)*f.num);
	}
	bool operator >(const fraccion& f) const{
		ll d = __gcd(den, f.den);
		return ((ii)num*(f.den/d) > ((ii)den/d)*f.num);
	}
	bool operator <(const fraccion& f) const{
		ll d = __gcd(den, f.den);
		return ((ii)num*(f.den/d) < ((ii)den/d)*f.num);
	}
	bool operator >=(const fraccion& f) const{
		ll d = __gcd(den, f.den);
		return ((ii)num*(f.den/d) >= ((ii)den/d)*f.num);
	}
	bool operator <=(const fraccion& f) const{
		ll d = __gcd(den, f.den);
		return ((ii)num*(f.den/d) <= ((ii)den/d)*f.num);
	}
	fraccion inverso() const{
		return fraccion(den, num);
	}
	fraccion fabs() const{
		fraccion nueva;
		nueva.num = abs(num);
		nueva.den = den;
		return nueva;
	}
	long double value() const{
		return (long double)num / (long double)den;
	}
};

bool geqf(fraccion a, fraccion b){return a >= b;}
bool leqf(fraccion a, fraccion b){return a <= b;}
bool gef(fraccion a, fraccion b){return a > b;}
bool lef(fraccion a, fraccion b){return a < b;}
bool eqf(fraccion a, fraccion b){return a == b;}
bool neqf(fraccion a, fraccion b){return a != b;}

struct point{
	ld x, y;
	point(): x(0), y(0){}
	point(ld x, ld y): x(x), y(y){}

	point operator+(const point & p) const{return point(x + p.x, y + p.y);}
	point operator-(const point & p) const{return point(x - p.x, y - p.y);}
	point operator*(const ld & k) const{return point(x * k, y * k);}
	point operator/(const ld & k) const{return point(x / k, y / k);}

	point perp() const{return point(-y, x);}
	ld dot(const point & p) const{return x * p.x + y * p.y;}
	ld cross(const point & p) const{return x * p.y - y * p.x;}
	ld norm() const{return x * x + y * y;}
	ld length() const{return sqrtl(x * x + y * y);}
	point unit() const{return (*this) / length();}

	bool operator==(const point & p) const{return eq(x, p.x) && eq(y, p.y);}
	bool operator!=(const point & p) const{return !(*this == p);}
	bool operator<(const point & p) const{return le(x, p.x) || (eq(x, p.x) && le(y, p.y));}
	bool operator>(const point & p) const{return ge(x, p.x) || (eq(x, p.x) && ge(y, p.y));}
};

istream &operator>>(istream &is, point & p){return is >> p.x >> p.y;}
ostream &operator<<(ostream &os, const point & p){return os << "(" << p.x << ", " << p.y << ")";}

struct pointf {
    fraccion x, y;
    pointf(): x(fraccion()), y(fraccion()) {}
    pointf(fraccion x, fraccion y): x(x), y(y) {}

    pointf operator+(const pointf & p) const{return pointf(x + p.x, y + p.y);}
    pointf operator-(const pointf & p) const{return pointf(x - p.x, y - p.y);}
    pointf operator*(const fraccion & k) const{return pointf(x * k, y * k);}
    pointf operator/(const fraccion & k) const{return pointf(x / k, y / k);}
    
    pointf operator+=(const pointf & p){*this = *this + p; return *this;}
    pointf operator-=(const pointf & p){*this = *this - p; return *this;}
    pointf operator*=(const fraccion & p){*this = *this * p; return *this;}
    pointf operator/=(const fraccion & p){*this = *this / p; return *this;}

    fraccion dot(const pointf & p) const{return x * p.x + y * p.y;}
    fraccion cross(const pointf & p) const{return x * p.y - y * p.x;}
    fraccion norm() const{return x + y;}

    bool operator==(const pointf & p) const{return eqf(x, p.x) && eqf(y, p.y);}
    bool operator!=(const pointf & p) const{return !(*this == p);}
    bool operator<(const pointf & p) const{return lef(x, p.x) || (eqf(x, p.x) && lef(y, p.y));}
    bool operator>(const pointf & p) const{return gef(x, p.x) || (eqf(x, p.x) && gef(y, p.y));}
};

int sgn(ld x){
	if(ge(x, 0)) return 1;
	if(le(x, 0)) return -1;
	return 0;
}

vector<point> convexHull(vector<point> P){
	sort(P.begin(), P.end());
	vector<point> L, U;
	for(int i = 0; i < P.size(); i++){
		while(L.size() >= 2 && leq((L[L.size() - 2] - P[i]).cross(L[L.size() - 1] - P[i]), 0)){
			L.pop_back();
		}
		L.push_back(P[i]);
	}
	for(int i = P.size() - 1; i >= 0; i--){
		while(U.size() >= 2 && leq((U[U.size() - 2] - P[i]).cross(U[U.size() - 1] - P[i]), 0)){
			U.pop_back();
		}
		U.push_back(P[i]);
	}
	L.pop_back();
	U.pop_back();
	L.insert(L.end(), U.begin(), U.end());
	return L;
}

vector<vector<point>> twoSidesCH(vector<point> P){
	sort(P.begin(), P.end());
	vector<vector<point>> L;
	vector<point> U;
	for(int i = 0; i < P.size(); i++){
		while(U.size() >= 2 && leq((U[U.size() - 2] - P[i]).cross(U[U.size() - 1] - P[i]), 0)){
			U.pop_back();
		}
		U.push_back(P[i]);
	}
	if(eq(U[U.size() - 1].x, U[U.size() - 2].x)) U.pop_back();
	L.pb(U);
	U.clear();
	for(int i = P.size() - 1; i >= 0; i--){
		while(U.size() >= 2 && leq((U[U.size() - 2] - P[i]).cross(U[U.size() - 1] - P[i]), 0)){
			U.pop_back();
		}
		U.push_back(P[i]);
	}
	reverse(all(U));
	if(eq(U[U.size() - 1].x, U[U.size() - 2].x)) U.pop_back();
	reverse(all(U));
	if(eq(U[U.size() - 1].x, U[U.size() - 2].x)) U.pop_back();
	L.pb(U);
	return L;
}

pointf intersectLinesf(const point & a1, const point & v1, const point & a2, const point & v2){
	fraccion det = v1.cross(v2);
	pointf b1(a1.x, a1.y), u1(v1.x, v1.y), b2(a2.x, a2.y), u2(v2.x, v2.y);
	return b1 + u1 * ((b2 - b1).cross(u2) / det);
}

point intersectLines(const point & a1, const point & v1, const point & a2, const point & v2){
	//lines a1+tv1, a2+tv2
	//assuming that they intersect
	ld det = v1.cross(v2);
	return a1 + v1 * ((a2 - a1).cross(v2) / det);
}

bool pointInLine(const point & a, const point & v, const point & p){
	return eq((p - a).cross(v), 0);
}

bool pointInSegment(const point & a, const point & b, const point & p){
	return pointInLine(a, b - a, p) && leq((a - p).dot(b - p), 0);
}

int intersectSegmentsInfo(const point & a, const point & b, const point & c, const point & d){
	//segment ab, segment cd
	point v1 = b - a, v2 = d - c;
	int t = sgn(v1.cross(c - a)), u = sgn(v1.cross(d - a));
	if(t == u){
		if(t == 0){
			if(pointInSegment(a, b, c) || pointInSegment(a, b, d) || pointInSegment(c, d, a) || pointInSegment(c, d, b)){
				return -1; //infinity points
			}else{
				return 0; //no point
			}
		}else{
			return 0; //no point
		}
	}else{
		return sgn(v2.cross(a - c)) != sgn(v2.cross(b - c)); //1: single point, 0: no point
	}
}

bool pointInPerimeter(const vector<point> & P, const point & p){
	int n = P.size();
	for(int i = 0; i < n; i++){
		if(pointInSegment(P[i], P[(i + 1) % n], p)){
			return true;
		}
	}
	return false;
}

bool crossesRay(const point & a, const point & b, const point & p){
	return (geq(b.y, p.y) - geq(a.y, p.y)) * sgn((a - p).cross(b - p)) > 0;
}

int pointInPolygon(const vector<point> & P, const point & p){
	if(pointInPerimeter(P, p)){
		return 1;
	}
	int n = P.size();
	int rays = 0;
	for(int i = 0; i < n; i++){
		rays += crossesRay(P[i], P[(i + 1) % n], p);
	}
	return rays & 1;
}

vector<point> tangentsPointPolygon(const vector<point> & P, const vector<vector<point>> & Ps, const point & p, const vector<vector<point>> & T, const vector<vector<int>> & Ls, const vector<point> & B){
	for(int i = 0; i < T.size(); i++){
		if(pointInPolygon(T[i], p)){
		    return {T[i][1], T[i][0]}; 
		}
	}

	int n = P.size(), m = Ps[0].size(), k = Ps[1].size();

	auto tang = [&](int l, int r, const vector<point> & A, ld w) -> int {
		int res = l;
		int y = A.size();
        while(l <= r){
            int m = (l + r) / 2;
			ld a = (A[m] - p).cross(A[(m + 1) % y] - p) * w, b = (A[m] - p).cross(A[(m - 1 + y) % y] - p) * w;
			if(geq(a, 0) && geq(b, 0)) return m;
            if(geq(a, 0)) r = m - 1, res = m;
            else l = m + 1;
        }
        return res;
    };

	auto bs = [&](int l, int r, const vector<point> & A, ld w) -> int {
        int res = l;
        ld w1 = p.x * w;
        while(l <= r){
            int m = (l + r) / 2;
			if(ge(A[m].x * w, w1)) r = m - 1;
			else res = max(res, m), l = m + 1;
        }
        return res;
    };
	point left = p, rigth = p;
	point f1 = Ps[0][0], f2 = Ps[0][m - 1];
	//auto j = (P[Ls[0][1]] - P[Ls[0][0]]).cross(P[Ls[1][1]] - P[Ls[1][0]]); cout<<j.value();
	//for(auto e : Ls) for(auto d : e) cout<<" "<<d<<" ";
	//j = (P[Ls[2][1]] - P[Ls[2][0]]).cross(P[Ls[3][1]] - P[Ls[3][0]]); cout<<j.value();
	//return {p, p};
	if(neq((P[Ls[0][1]] - P[Ls[0][0]]).cross(P[Ls[1][1]] - P[Ls[1][0]]), 0)){
	    auto yh = intersectLines(P[Ls[0][0]], P[Ls[0][1]] - P[Ls[0][0]], P[Ls[1][0]], P[Ls[1][1]] - P[Ls[1][0]]);
	    //cout<<P[Ls[0][0]]<<" & "<<P[Ls[0][1]]<<" w "<<P[Ls[1][0]]<<" & "<<P[Ls[1][1]]<<" => "<<yh<<" ? ";
	    if(yh.x < f1.x) f1 = yh;
	}
	if(neq((P[Ls[2][1]] - P[Ls[2][0]]).cross(P[Ls[3][1]] - P[Ls[3][0]]), 0)){
	    auto yh = intersectLines(P[Ls[2][0]], P[Ls[2][1]] - P[Ls[2][0]], P[Ls[3][0]], P[Ls[3][1]] - P[Ls[3][0]]);
	    if(yh.x > f2.x) f2 = yh;
	}
	//cout<<" | "<<f1<<" "<<f2<<" | ";
	//return {p, p};
	//cout<<P[Ls[0][0]]<<" , "<<P[Ls[0][1]]<<" | "<<P[Ls[1][0]]<<" , "<<P[Ls[1][1]]<<" | "<<P[Ls[2][0]]<<" , "<<P[Ls[2][1]]<<" | "<<P[Ls[3][0]]<<" , "<<P[Ls[3][1]]<<'\n';
	if(geq((P[Ls[0][1]] - P[Ls[0][0]]).cross(p - P[Ls[0][0]]), 0) && geq((P[Ls[1][1]]- P[Ls[1][0]]).cross(p - P[Ls[1][0]]), 0) && Ls[0][0] != Ls[0][1]){
		//cout<<" A ";
		left = Ps[1][tang(0, k - 1, Ps[1], -1)];
		rigth = Ps[0][tang(0, m - 1, Ps[0], 1)];
	}else if(geq((P[Ls[2][1]] - P[Ls[2][0]]).cross(p - P[Ls[2][0]]), 0) && geq((P[Ls[3][1]]- P[Ls[3][0]]).cross(p - P[Ls[3][0]]), 0) && Ls[2][0] != Ls[2][1]){
		//cout<<" B ";
		left = Ps[0][tang(0, m - 1, Ps[0], -1)];
		rigth = Ps[1][tang(0, k - 1, Ps[1], 1)];
	}else if(le((f2 - f1).cross(p - f1), 0)){
		//cout<<" C ";
		int t = bs(0, m - 1, Ps[0], 1);
		if(leq((Ps[1][k - 1] - p).cross(Ps[0][0] - p), 0) && leq((Ps[1][k - 1] - p).cross(Ps[1][k - 2] - p), 0) && leq((Ps[1][k - 1] - p).cross(Ps[0][1] - p), 0)) left = Ps[1][k - 1];
		else left = Ps[0][tang(0, min(t, m - 2), Ps[0], -1)];
		if(geq((Ps[1][0] - p).cross(Ps[0][m - 1] - p), 0) && geq((Ps[1][0] - p).cross(Ps[1][1] - p), 0) && geq((Ps[1][0] - p).cross(Ps[0][m - 2] - p), 0)) rigth = Ps[1][0];
		else rigth = Ps[0][tang(min(t + 1, m - 1), m - 1, Ps[0], 1)];
	}else if(ge((f2 - f1).cross(p - f1), 0)){
		//cout<<" D ";
		int t = bs(0, k - 1, Ps[1], -1);
		if(leq((Ps[0][m - 1] - p).cross(Ps[1][0] - p), 0) && leq((Ps[0][m - 1] - p).cross(Ps[0][m - 2] - p), 0) && leq((Ps[0][m - 1] - p).cross(Ps[1][1] - p), 0)) left = Ps[0][m - 1];
		else left = Ps[1][tang(0, min(t, k - 2), Ps[1], -1)];
		if(geq((Ps[0][0] - p).cross(Ps[1][k - 1] - p), 0) && geq((Ps[0][0] - p).cross(Ps[1][k - 2] - p), 0) && geq((Ps[0][0] - p).cross(Ps[0][1] - p), 0)) rigth = Ps[0][0];
		else rigth = Ps[1][tang(min(t + 1, k - 1), k - 1, Ps[1], 1)];
	}else{
	  //  cout<<"C";
	    int i = lower_bound(all(Ps[0]), p) - Ps[0].begin();
	    int j = lower_bound(all(B), p) - B.begin();
	    if(pointInSegment(Ps[0][i], Ps[0][i - 1], p)) left = Ps[0][i - 1], rigth = Ps[0][i];
	    if(pointInSegment(B[j], B[j - 1], p)) left = B[j], rigth = B[j - 1];
	}
	return {left, rigth};
}

pair<vector<vector<point>>, vector<vector<int>>> precTangents(vector<point> P){
	int n = P.size();
	auto R = twoSidesCH(P);
	//for(auto e : R[0]) cout<<e<<" "; cout<<'\n';
	//for(auto e : R[1]) cout<<e<<" "; cout<<'\n';
	int m = R[0].size(), k = R[1].size();
	bool f1 = false, f2 = false;
	int il1 = 0, il2 = 0, sl1 = 0, sl2 = 0, ir1 = 0, ir2 = 0, sr1 = 0, sr2 = 0;
	il1 = 1; il2 = 0; sl1 = 0; sl2 = n - 1;
	ir1 = m - 1; ir2 = m - 2; sr1 = m % n; sr2 = m - 1;
	if(R[0][m - 1] != R[1][0]) sr1 = (sr1 + 1) % n, sr2 = (sr2 + 1) % n;
	if(R[0][0] != R[1][k - 1]) sl1 = n - 1, sl2 = n - 2;
	point a(-Inf2, -1000), b(-Inf2, 1000);
	//cout<<P[il1]<<" "<<P[il2]<<'\n'<<P[sl1]<<" "<<P[sl2]<<'\n'<<P[ir1]<<" "<<P[ir2]<<'\n'<<P[sr1]<<" "<<P[sr2]<<'\n';
	vector<vector<point>> Ts;
	if(il2 != sl1){
		if(eq((P[il2] - P[il1]).cross(P[sl2] - P[sl1]), 0)){
			auto it = intersectLines(P[il1], P[il2] - P[il1], a, b - a), at = intersectLines(P[sl1], P[sl2] - P[sl1], a, b - a);
			Ts.pb({P[il2], P[sl1], at, it});
			//cout<<" Aa ";
			//il1 = il2 = sl1 = sl2 = -1;
		}else{
			auto it = intersectLines(P[il1], P[il2] - P[il1], P[sl1], P[sl2] - P[sl1]);
			if(ge(it.x, P[il1].x)){
				auto it = intersectLines(P[il1], P[il2] - P[il1], a, b - a), at = intersectLines(P[sl1], P[sl2] - P[sl1], a, b - a);
				Ts.pb({P[il2], P[sl1], at, it});
				//cout<<" Bb ";
			//	il1 = il2 = sl1 = sl2 = -1;
			}else{
				Ts.pb({P[il2], P[sl1], it});
				//cout<<" Ff ";
			}
		}
	}
	a = point(Inf2, -1000); b = point(Inf2, 1000);
	if(sr2 != ir1){
		if(eq((P[ir2] - P[ir1]).cross(P[sr2] - P[sr1]), 0)){
			auto it = intersectLines(P[ir1], P[ir2] - P[ir1], a, b - a), at = intersectLines(P[sr1], P[sr2] - P[sr1], a, b - a);
			Ts.pb({P[sr2], P[ir1], it, at});
			//cout<<" Cc ";
			//ir1 = ir2 = sr1 = sr2 = -1;
		}else{
			auto it = intersectLines(P[ir1], P[ir2] - P[ir1], P[sr1], P[sr2] - P[sr1]);
			if(le(it.x, P[ir1].x)){
				auto it = intersectLines(P[ir1], P[ir2] - P[ir1], a, b - a), at = intersectLines(P[sr1], P[sr2] - P[sr1], a, b - a);
				Ts.pb({P[sr2], P[ir1], it, at});
				//cout<<" Dd ";
				//cout<<ir1<<" "<<ir2<<" "<<sr1<<" "<<sr2<<'\n';
			//	ir1 = ir2 = sr1 = sr2 = 0;
			}else{
				Ts.pb({P[sr2], P[ir1], it});
				//cout<<" Tt ";
			}
		}
	}
	return {Ts, {{il1, il2}, {sl1, sl2}, {ir1, ir2}, {sr1, sr2}}};
}

pair<fraccion, fraccion> calc(vector<point> & A, vector<point> B, pair<vector<vector<point>>, vector<vector<int>>> & zw, vector<vector<point>> & tws, vector<point> & tw){
    fraccion minx = Inf2, maxx = -Inf2;
    pointf x0(-Inf2, 0), x1(Inf2, 0);
    point s0(-Inf2, 0), s1(Inf2, 0);
    int n = B.size();
    for(int i = 0; i < n; i++){
        auto u = intersectSegmentsInfo(B[i], B[(i + 1) % n], s0, s1);
        if(u == 1){
            auto p = intersectLinesf(B[i], B[(i + 1) % n] - B[i], s0, s1 - s0);
            minx = min(minx, p.x); maxx = max(maxx, p.x);
        }else if(u == -1){
            minx = min(minx, min(fraccion(B[i].x), fraccion(B[(i + 1) % n].x)));
            maxx = max(maxx, max(fraccion(B[i].x), fraccion(B[(i + 1) % n].x)));
        }
    }
    point a1(1, 0);
    for(int i = 0; i < n; i++){
        auto ts = tangentsPointPolygon(A, tws, B[i], zw.fi, zw.se, tw);
        point t1 = ts[0], t2 = ts[1];
        //cout<<B[i]<<" => "<<t1<<" & "<<t2<<'\n';
        if(neq(a1.cross(t1 - B[i]), 0)){
            auto p1 = intersectLinesf(B[i], t1 - B[i], point(0, 0), a1);
			point p(p1.x.value(), p1.y.value());
            //cout<<p.x.value()<<" , "<<p.y.value()<<" | ";
            if(eq((p - t1).length(), (p - B[i]).length() + (B[i] - t1).length())){
                //cout<<"r";
                if(minx > p1.x) minx = p1.x; if(maxx < p1.x) maxx = p1.x;
            }else if(neq((p - t1).length() + (p - B[i]).length(), (B[i] - t1).length())){
                if(B[i].x < t1.x){
                    minx = -Inf2;
                }else if(B[i].x > t1.x){
                    maxx = Inf2;
                }
            }
        }
        if(neq(a1.cross(t2 - B[i]), 0)){
            auto p1 = intersectLinesf(B[i], t2 - B[i], point(0, 0), a1);
            point p(p1.x.value(), p1.y.value());
			//cout<<p.x.value()<<" , "<<p.y.value()<<'\n';
            if(eq((p - t2).length(), (p - B[i]).length() + (B[i] - t2).length())){
                //cout<<"r";
                if(minx > p1.x) minx = p1.x; if(maxx < p1.x) maxx = p1.x;
            }else if(neq((p - t2).length() + (p - B[i]).length(), (B[i] - t2).length())){
                if(B[i].x < t2.x){
                    minx = -Inf2;
                }else if(B[i].x > t2.x){
                    maxx = Inf2;
                }
            }
        }
    }
    //cout<<minx.value()<<" "<<maxx.value()<<'\n';
    if(minx == -Inf2 && maxx == Inf2) return {Inf2, Inf2};
    return {minx, maxx};
}

ld calc1(){
    int m, l, r; cin>>m>>l>>r;
    int n; cin>>n;
    vector<point> P(n);
    for(int i = 0; i < n; i++){
        int a, b; cin>>a>>b; P[i] = point(a, b);
    }
    vector<vector<point>> Moons;
    for(int i = 0; i < m; i++){
        int k; cin>>k; vector<point> aux;
        for(int j = 0; j < k; j++){
            int a, b; cin>>a>>b; aux.pb(point(a, b));
        }
        Moons.pb(aux);
    }
    
    P = convexHull(P);
    auto zw = precTangents(P);
	auto tws = twoSidesCH(P);
	auto tw = tws[1]; sort(all(tw));
	//for(auto e : tws[0]) cout<<e<<" "; cout<<'\n';
	//for(auto e : tw) cout<<e<<" "; cout<<'\n';
    vector<pair<fraccion, fraccion>> Segs;
    for(int i = 0; i < m; i++){
        auto u = calc(P, Moons[i], zw, tws, tw);
        //cout<<'\n'<<"----------------------------------------"<<'\n';
        Segs.pb(u);
    }
    sort(all(Segs));
    //for(auto e : Segs) cout<<setprecision(15)<<e.fi.value()<<" , "<<e.se.value()<<" | "; cout<<'\n';
    //cout<<(fraccion(Segs[0].se) - fraccion(Segs[0].fi)).value()<<" ";
    ld ans = 0; fraccion ant(l); bool f = false;
    for(int i = 0; i < m; i++){
        if(Segs[i].fi > fraccion(r)){
            if(fraccion(r) > ant){
                f = true;
            }
            if(ant < fraccion(r)) ans += (fraccion(r) - ant).value();
            ant = r;
            break;
        }
        if(Segs[i].fi >= ant){
            if(!((Segs[i].fi == l && ant == l) || (Segs[i].fi == r && ant == r))) f = true; 
            //cout<<(Segs[i].fi - ant).value();
        }
        if(ant < Segs[i].fi) ans += abs((ant - Segs[i].fi).value());
        ant = max(ant, Segs[i].se);
        //cout<<ans<<'\n';
    }
    if(ant < r) ans += (fraccion(r) - max(ant, fraccion(l))).value(), f = true;
    if(!f) return -1;
    return ans;
}

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t; cin>>t;
    if(t == 16667){
        for(int w = 0; w < t; w++){
            int m, l, r; cin>>m>>l>>r;
            int n; cin>>n;
            vector<point> P(n);
            for(int i = 0; i < n; i++){
                int a, b; cin>>a>>b; P[i] = point(a, b);
            }
            vector<vector<point>> Moons;
            for(int i = 0; i < m; i++){
                int k; cin>>k; vector<point> aux;
                for(int j = 0; j < k; j++){
                    int a, b; cin>>a>>b; aux.pb(point(a, b));
                }
                Moons.pb(aux);
            }
            if(w == 43){
                cout<<m<<" "<<l<<" "<<r<<'\n';
                cout<<n<<" ";
                for(auto e : P) cout<<e<<" "; cout<<'\n';
                for(auto e : Moons){
                    cout<<e.size()<<" "; for(auto d : e) cout<<d<<" "; cout<<'\n';
                }
            }
        }
        return 0;
    }
    while(t--){
		auto p = calc1();
        cout<<setprecision(25)<<p<<'\n';
    }
}

详细

Test #1:

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

input:

2
4 -8 8
3 -7 7 -6 8 -7 8
3 -9 -2 -7 3 -9 -1
3 -2 3 0 2 -4 5
3 5 1 5 3 4 2
3 1 -1 2 -2 3 -1
5 -8 8
5 -14 -3 -10 -2 -9 2 -10 4 -12 5
3 -16 0 -15 0 -15 1
3 -15 6 -9 5 -15 7
3 -10 5 -9 5 -10 6
3 -7 3 -3 2 -8 4
3 -6 -1 -6 -2 -5 -1

output:

9.404761904761904761987368
6

result:

ok 2 numbers

Test #2:

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

input:

3
1 -4 4
3 -2 6 0 5 2 6
3 -3 1 3 1 0 4
3 -2 2
3 -2 4 2 4 0 6
3 -2 2 -1 2 -2 3
3 1 2 2 2 2 3
3 -2 -1 0 -3 2 -1
1 1 2
3 -8 0 -7 0 -8 1
3 -5 0 -4 -1 -4 0

output:

-1
0
1

result:

ok 3 numbers

Test #3:

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

input:

1
1 -744567334 955216804
5 -781518205 -852078097 -781516900 -852078384 -781516392 -852076569 -781518329 -852076047 -781519925 -852077600
5 -393011614 -131855702 -393010699 -131856607 -393008846 -131856475 -393009388 -131854587 -393010201 -131854694

output:

1699779738.691979192313738

result:

ok found '1699779738.691979170', expected '1699779738.691979170', error '0.000000000'

Test #4:

score: 0
Accepted
time: 181ms
memory: 4096kb

input:

16666
2 -732787031 -732787030
3 -798263477 735869144 -583647039 529057159 -583647039 529057160
3 -777230180 499482549 -777230181 499482549 -777230180 499482548
3 -661853868 251627327 -661853868 251627326 -661853867 251627327
2 463140451 463140452
3 232604219 637008523 797038205 345997813 797038205 3...

output:

-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
...

result:

ok 16666 numbers

Test #5:

score: -100
Wrong Answer
time: 18ms
memory: 4096kb

input:

16667
2 -9 7
3 -8 4 -6 1 -4 2
3 6 13 2 12 3 10
3 -1 7 0 10 -3 4
2 -9 5
3 -8 10 -5 8 -4 10
3 10 -8 9 -11 12 -8
3 -10 -5 -8 -4 -7 -1
2 -6 5
3 -8 6 -7 6 -5 7
3 -2 -3 1 -4 -4 -2
3 1 10 0 10 -1 8
2 -9 9
3 -5 -11 -2 -11 -5 -8
3 6 -5 5 -2 4 -5
3 11 6 9 3 11 3
2 -6 5
3 -7 6 -8 7 -9 4
3 9 2 12 -3 11 0
3 -6 3...

output:

2 -7 8
3 (11, -10) (10, -10) (13, -11) 
3 (8, 5) (11, 3) (12, 5) 
3 (6, 4) (6, 7) (5, 7) 

result:

wrong answer 1st numbers differ - expected: '16.0000000', found: '2.0000000', error = '0.8750000'