QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#327495 | #6599. The Grand Tournament | lmf_up | AC ✓ | 191ms | 4168kb | C++20 | 29.9kb | 2024-02-15 02:58:57 | 2024-02-15 02:58:57 |
Judging History
answer
#include<bits/stdc++.h>
#define cp const point &
#define cl const line &
#define cc const circle &
#define LD long double
std::mt19937 rnd(time(0));
const LD eps = 1e-12;
const LD pi = std::numbers::pi;
const LD INF = 1e9;
int sgn(LD x)
{
return x > eps ? 1 : (x < -eps ? -1 : 0);
}
LD sqr(LD x)
{ return x * x; }
struct point
{
LD x, y;
point operator+(cp a) const
{ return {x + a.x, y + a.y}; }
point operator-(cp a) const
{ return {x - a.x, y - a.y}; }
point operator*(LD t) const
{ return {x * t, y * t}; }
point operator/(LD t) const
{ return {x / t, y / t}; }
point rot(LD t) const
{ return {(LD) (x * cos(t) - y * sin(t)), (LD) (x * sin(t) + y * cos(t))}; }
point rot90() const
{ return {-y, x}; }
LD len2() const
{ return x * x + y * y; }
LD len() const
{ return sqrtl(x * x + y * y); }
point unit() const
{
LD d = len();
return {(LD) (x / d), (LD) (y / d)};
}
int on_up()//b不判(0,0)
{
return sgn(y) == 1 || (sgn(y) == 0 && sgn(x) <0);
}
void print()
{
std::cout << x << ' ' << y << std::endl;
}
void read()
{
int xx, yy;
std::cin >> xx >> yy;
x = xx, y = yy;
}
friend bool operator<(cp a, cp b)
{
return a.x == b.x ? a.y < b.y : a.x < b.x;
}
friend bool operator>(cp a, cp b)
{
return a.x == b.x ? a.y > b.y : a.x > b.x;
}
};
LD dot(cp a, cp b);
bool operator==(cp a, cp b)
{
return !sgn(dot(a - b, a - b));
// return !sgn(a.x-b.x)&&!(a.y-b.y);看题目
}
LD dis(cp a, cp b)//两点距离
{
return sqrtl(sqr(a.x - b.x) + sqr(a.y - b.y));
}
LD dot(cp a, cp b)//点乘
{
return a.x * b.x + a.y * b.y;
}
LD det(cp a, cp b)//叉乘
{
return a.x * b.y - b.x * a.y;
}
bool turn_left(cp a, cp b, cp c)//判断ba是否逆时针转少于180°到ca
{
return sgn(det(b - a, c - a)) > 0;//大于是严格凸包
}
struct line
{
point s, t;
line()
{}
line(point a, point b) : s(a), t(b)
{}
void read()
{
s.read(), t.read();
}
void print()
{
s.print(), std::cout << ' ', t.print();
}
};
struct circle
{
point c;
LD r;
circle()
{}
circle(point C, LD R)
{ c = C, r = R; }
};
bool in_circle(cp a, cc b)
{
return sgn((b.c - a).len() - b.r) <= 0;
}
circle make_circle(point u, point v)
{
point p = (u + v) / 2;
return circle(p, (u - p).len());
}
circle make_circle(cp a, cp b, cp c)
{
point p = b - a, q = c - a;
point s(dot(p, p) / 2, dot(q, q) / 2);
LD d = det(p, q);
p = point(det(s, point(p.y, q.y)), det(point(p.x, q.x), s)) / d;
return circle(a + p, p.len());
}
circle min_circle(std::vector<point> p)
{
circle ret(p[0], 0);
std::shuffle(p.begin(), p.end(), rnd);
int len = p.size();
for (int i = 0; i < len; i++)
if (!in_circle(p[i], ret))
{
ret = circle(p[i], 0);
for (int j = 0; j < i; j++)
if (!in_circle(p[j], ret))
{
ret = make_circle(p[j], p[i]);
for (int k = 0; k < j; ++k)
if (!in_circle(p[k], ret))
ret = make_circle(p[i], p[j], p[k]);
}
}
return ret;
}
LD get_rad(point a, point b)
{
if (a == point(0, 0) || b == point(0, 0))
return 0;
else
{
return acosl(dot(a, b) / (a.len() * b.len()));
}
}
bool same_dir(cl a, cl b)//判断方向是否一致
{
return sgn(det(b.t - b.s, a.t - a.s)) == 0 && sgn(dot(b.t - b.s, a.t - a.s)) > 0;
}
bool point_on_line(cp a, cl l)//判断点是否在直线上
{
return sgn(det(a - l.s, l.t - l.s)) == 0;
}
bool point_on_segment(cp a, cl l)//判断点是否在线段上
{
return point_on_line(a, l) && sgn(dot(l.s - a, l.t - a)) <= 0;//(<=代表可以端点
}
bool two_side(cp a, cp b, cl c)//判断两个点是否在线段的两边
{
return sgn(det(a - c.s, c.t - c.s)) * sgn(det(b - c.s, c.t - c.s)) < 0;
}
bool intersect_judge_strict(cl a, cl b)
{
return two_side(a.s, a.t, b) && two_side(b.s, b.t, a);
}
bool intersect_judge(cl a, cl b)
{//判断两个线段是否相交
if (point_on_segment(a.s, b) || point_on_segment(a.t, b) || point_on_segment(b.s, a) ||
point_on_segment(b.t, a))
return true;
return intersect_judge_strict(a, b);
}
point line_intersect(cl a, cl b)
{//得到两线段的交点
LD s1 = det(a.t - a.s, b.s - a.s);
LD s2 = det(a.t - a.s, b.t - a.s);
return (b.s * s2 - b.t * s1) / (s2 - s1);
}
bool point_on_ray(cp a, cl b)
{//判断点是否在射线上
return sgn(det(a - b.s, b.t - b.s)) == 0 && sgn(dot(a - b.s, b.t - b.s)) >= 0;
}
bool ray_intersect_judge(line a, line b)//判断两射线是否相交
{
LD s1, s2;
s1 = det(a.t - a.s, b.s - a.s);
s2 = det(a.t - a.s, b.t - a.s);
if (sgn(s1) == 0 && sgn(s2) == 0)
return sgn(dot(a.t - a.s, b.s - a.s)) >= 0 || sgn(dot(b.t - b.s, a.s - b.s));
if (!sgn(s1 - s2) || sgn(s1) == sgn(s2 - s1))return 0;
std::swap(a, b);
s1 = det(a.t - a.s, b.s - a.s);
s2 = det(a.t - a.s, b.t - a.s);
return sgn(s1) != sgn(s2 - s1);
}
LD point_to_line(cp a, cl b)
{//点到直线的距离
return abs(det(b.t - b.s, a - b.s)) / dis(b.s, b.t);
}
point project_to_line(cp a, cl b)
{//得到点在线上的投影
return b.s + (b.t - b.s) * (dot(a - b.s, b.t - b.s) / (b.t - b.s).len2());
}
LD point_to_segment(cp a, cl b)
{//点到线段的距离
if (b.s == b.t)
return dis(a, b.s);
if (sgn(dot(b.s - a, b.t - b.s)) * sgn(dot(b.t - a, b.t - b.s)) <= 0)
return abs(det(b.t - b.s, a - b.s)) / dis(b.s, b.t);
return std::min(dis(a, b.s), dis(a, b.t));
}
std::vector<point> line_circle_intersect(cl a, cc b)//线与圆的交点
{//返回线与圆的交点
if (sgn(point_to_segment(b.c, a) - b.r) > 0)
return std::vector<point>();
LD x = sqrtl(sqr(b.r) - sqr(point_to_line(b.c, a)));
return std::vector<point>(
{project_to_line(b.c, a) + (a.s - a.t).unit() * x, project_to_line(b.c, a) - (a.s - a.t).unit() * x});
}
LD circle_intersect_area(cc a, cc b)//求两个圆相交区域的面积
{
LD d = dis(a.c, b.c);
if (sgn(d - (a.r + b.r)) >= 0)return 0;
if (sgn(d - abs(a.r - b.r)) <= 0)
{
LD r = std::min(a.r, b.r);
return r * r * pi;
}
LD x = (d * d + a.r * a.r - b.r * b.r) / (2 * d),
t1 = acosl(std::min((LD) 1, std::max((LD) -1, x / a.r))),
t2 = acosl(std::min((LD) 1, std::max((LD) -1, (d - x) / b.r)));
return sqr(a.r) * t1 + sqr(b.r) * t2 - d * a.r * sinl(t1);
}
std::vector<point> circle_intersect(cc a, cc b)//求两个圆的交
{
if (a.c == b.c || sgn(dis(a.c, b.c) - a.r - b.r) > 0 || sgn(dis(a.c, b.c) - abs(a.r - b.r)) < 0)
return {};
point r = (b.c - a.c).unit();
LD d = dis(a.c, b.c);
LD x = ((sqr(a.r) - sqr(b.r)) / d + d) / 2;
LD h = sqrtl(sqr(a.r) - sqr(x));
if (sgn(h) == 0)return {a.c + r * x};
return {a.c + r * x + r.rot90() * h, a.c + r * x - r.rot90() * h};
}
std::vector<point> tangent(cp a, cc b)//求一个点关于圆的切线
{
circle p = make_circle(a, b.c);
return circle_intersect(p, b);
}
std::vector<line> extangent(cc a, cc b)//求两圆的外切线
{
std::vector<line> ret;
if (sgn(dis(a.c, b.c) - abs(a.r - b.r)) <= 0)return ret;
if (sgn(a.r - b.r) == 0)
{
point dir = b.c - a.c;
dir = (dir * a.r / dir.len()).rot90();
ret.push_back(line(a.c + dir, b.c + dir));
ret.push_back(line(a.c - dir, b.c - dir));
}
else
{
point p = (b.c * a.r - a.c * b.r) / (a.r - b.r);
std::vector pp = tangent(p, a), qq = tangent(p, b);
if (pp.size() == 2 && qq.size() == 2)
{
if (sgn(a.r - b.r) < 0)
std::swap(pp[0], pp[1]), std::swap(qq[0], qq[1]);
ret.push_back(line(pp[0], qq[0]));
ret.push_back(line(pp[1], qq[1]));
}
}
return ret;
}
std::vector<line> intangent(cc a, cc b)//求两圆的内切线
{
std::vector<line> ret;
point p = (b.c * a.r + a.c * b.r) / (a.r + b.r);
std::vector pp = tangent(p, a), qq = tangent(p, b);
if (pp.size() == 2 && qq.size() == 2)
{
ret.push_back(line(pp[0], qq[0]));
ret.push_back(line(pp[1], qq[1]));
}
return ret;
}
std::vector<point> cut(const std::vector<point> &c, line p)
{
std::vector<point> ret;
if (c.empty())return ret;
int len = c.size();
for (int i = 0; i < len; i++)
{
int j = (i + 1) % len;
if (turn_left(p.s, p.t, c[i]))ret.push_back(c[i]);
if (two_side(c[i], c[j], p))
ret.push_back(line_intersect(p, line(c[i], c[j])));
}
return ret;
}
std::vector<point> convex_hull(std::vector<point> a)
{//凸包,字典序
int n = (int) a.size(), cnt = 0;
if (n < 2) return a;
std::sort(a.begin(), a.end()); // less<pair>
std::vector<point> ret;
for (int i = 0; i < n; ++i)
{
while (cnt > 1
&& !turn_left(ret[cnt - 1], a[i], ret[cnt - 2]))
--cnt, ret.pop_back();
++cnt, ret.push_back(a[i]);
}
int fixed = cnt;
for (int i = n - 2; i >= 0; --i)
{
while (cnt > fixed
&& !turn_left(ret[cnt - 1], a[i], ret[cnt - 2]))
--cnt, ret.pop_back();
++cnt, ret.push_back(a[i]);
}
ret.pop_back();
return ret;
}
std::vector<point> minkovski(std::vector<std::vector<point>> a)
{
if (a[0].size() == 1)
return a[1];
if (a[1].size() == 1)
return a[0];
for (int i = 0; i < 2; i++)a[i].push_back(a[i].front());
int i[2] = {0, 0}, len[2] = {(int) a[0].size() - 1, (int) a[1].size() - 1};
std::vector<point> ret;
ret.push_back(a[0][0] + a[1][0]);
do
{
int d = sgn(det(a[1][i[1] + 1] - a[1][i[1]], a[0][i[0] + 1] - a[0][i[0]])) >= 0;
ret.push_back(a[d][i[d] + 1] - a[d][i[d]] + ret.back());
i[d] = (i[d] + 1) % len[d];
}
while (i[0] || i[1]);
return ret;
}
struct Convex
{
int n;
std::vector<point> a, upper, lower;
std::map<point, int> mp;
Convex(std::vector<point> _a) : a(_a)
{
n = a.size();
int k = 0;
for (int i = 1; i < n; i++)if (a[k] < a[i])k = i;
for (int i = 0; i <= k; i++) lower.push_back(a[i]);
for (int i = k; i < n; i++) upper.push_back(a[i]);
upper.push_back(a[0]);
}
void pre_to_check_point()
{
for (int i = 0; i < n; i++)
mp[a[i]] = i;
}
std::pair<LD, int> get_tan(std::vector<point> &con, point vec)
{
int l = 0, r = (int) con.size() - 2;
for (; l + 1 < r;)
{
int mid = (l + r) / 2;
if (sgn(det(con[mid + 1] - con[mid], vec)) > 0)r = mid;
else l = mid;
}
return std::max(std::make_pair(det(vec, con[r]), r), std::make_pair(det(vec, con[0]), 0));
}
void upd_tan(cp p, int id, int &i0, int &i1)//辅助函数
{
// if (i0 == -1) i0 = id;
if ((det(a[i0] - p, a[id] - p)) > 0) i0 = id;
// if (i1 == -1) i1 = id;
if ((det(a[i1] - p, a[id] - p)) < 0) i1 = id;
}
void search(int l, int r, point p, int &i0, int &i1)//辅助函数
{
if (l == r)return;
upd_tan(p, l % n, i0, i1);
int sl = sgn(det(a[l % n] - p, a[(l + 1) % n] - p));
for (; l + 1 < r;)
{
int mid = (l + r) / 2;
int smid = sgn(det(a[mid % n] - p, a[(mid + 1) % n] - p));
if (smid == sl)l = mid;
else r = mid;
}
upd_tan(p, r % n, i0, i1);
}
int search(point u, point v, int l, int r)//辅助函数
{
int sl = sgn(det(v - u, a[l % n] - u));
for (; l + 1 < r;)
{
int mid = (l + r) / 2;
int smid = sgn(det(v - u, a[mid % n] - u));
if (smid == sl) l = mid;
else r = mid;
}
return l % n;
}
//判定点是否在凸包内,在边界返回true
bool contain(point p)
{
if (p.x < lower[0].x || p.x > lower.back().x)return false;
int id = std::lower_bound(lower.begin(), lower.end(), point(p.x, -INF)) - lower.begin();
if (lower[id].x == p.x)
{
if (lower[id].y > p.y)return false;
}
else if (det(lower[id - 1] - p, lower[id] - p) < 0)
return false;
id = std::lower_bound(upper.begin(), upper.end(), point(p.x, INF), std::greater<point>()) - upper.begin();
if (upper[id].x == p.x)
{
if (upper[id].y < p.y)return false;
}
else if (det(upper[id - 1] - p, upper[id] - p) < 0)
return false;
return true;
}
int contain_strict(point p)//0代表在外面 1代表在里面 2代表在边上 3代表在点上
{
if (p.x < lower[0].x || p.x > lower.back().x)return 0;
int id = std::lower_bound(lower.begin(), lower.end(), point(p.x, -INF)) - lower.begin();
if (lower[id].x == p.x)
{
if (lower[id].y > p.y)return 0;
else if (sgn(lower[id].y - p.y) == 0) return 3;
else if (id + 1 < lower.size() && lower[id + 1].x == p.x && p.y < lower[id + 1].y)
return 2;
else if (id + 1 < lower.size() && lower[id + 1].x == p.x && p.y == lower[id + 1].y)
return 3;
}
else if (det(lower[id - 1] - p, lower[id] - p) < 0)
return 0;
else if (sgn(det(lower[id - 1] - p, lower[id] - p)) == 0)
return 2;
id = std::lower_bound(upper.begin(), upper.end(), point(p.x, INF), std::greater<point>()) - upper.begin();
if (upper[id].x == p.x)
{
if (upper[id].y < p.y)return 0;
else if (upper[id].y == p.y)return 3;
else if (id + 1 < upper.size() && upper[id + 1].x == p.x && p.y > upper[id + 1].y)
return 2;
else if (id + 1 < upper.size() && upper[id + 1].x == p.x && p.y == upper[id + 1].y)
return 3;
}
else if (det(upper[id - 1] - p, upper[id] - p) < 0)
return 0;
else if (sgn(det(upper[id - 1] - p, upper[id] - p)) == 0)
return 2;
return 1;
}
bool get_tan(point p, int &i0, int &i1)
{// 求点 p 关于凸包的两个切点, 如果在凸包外则有序返回编号, 共线的多个切点返回任意一个, 否则返回 false
i0 = i1 = 0;
int id = int(std::lower_bound(lower.begin(), lower.end(), p) - lower.begin());
search(0, id, p, i0, i1);
search(id, (int) lower.size(), p, i0, i1);
id = int(std::lower_bound(upper.begin(), upper.end(), p, std::greater<point>()) - upper.begin());
search((int) lower.size() - 1, (int) lower.size() - 1 + id, p, i0, i1);
search((int) lower.size() - 1 + id, (int) lower.size() - 1 + (int) upper.size(), p, i0, i1);
return true;
}
bool my_get_tan(point p, int &i0, int &i1)//自己魔改,常数大,可求点在凸包上的切线
{
if (p.x < lower[0].x || p.x > lower.back().x)
{
get_tan(p, i0, i1);
return true;
}
int id = std::lower_bound(lower.begin(), lower.end(), point(p.x, -INF)) - lower.begin();
if (lower[id].x == p.x)
{
if (lower[id].y > p.y)
{
get_tan(p, i0, i1);
return true;
}
else if (sgn(lower[id].y - p.y) == 0)
{
i0 = (id - 1 + n) % n, i1 = (id + 1) % n;
return true;
}
else if (id + 1 < lower.size() && lower[id + 1].x == p.x && p.y < lower[id + 1].y)
{
i0 = id, i1 = (id + 1) % n;
return true;
}
else if (id + 1 < lower.size() && lower[id + 1].x == p.x && p.y == lower[id + 1].y)
{
i0 = id, i1 = (id + 2) % n;
return true;
}
}
else if (det(lower[id - 1] - p, lower[id] - p) < 0)
{
get_tan(p, i0, i1);
return true;
}
else if (sgn(det(lower[id - 1] - p, lower[id] - p)) == 0)
{
i0 = (id - 1 + n) % n, i1 = id;
return true;
}
id = std::lower_bound(upper.begin(), upper.end(), point(p.x, INF), std::greater<point>()) - upper.begin();
if (upper[id].x == p.x)
{
if (upper[id].y < p.y)
{
get_tan(p, i0, i1);
return true;
}
else if (upper[id].y == p.y)
{
i0 = id + lower.size() - 1;
i1 = (i0 + 1 + n) % n;
i0 = (i0 + n - 1) % n;
return true;
}
else if (id + 1 < upper.size() && upper[id + 1].x == p.x && p.y > upper[id + 1].y)
{
i0 = id + lower.size() - 1;
i1 = (i0 + 1) % n;
i0 = (i0 + n) % n;
return true;
}
else if (id + 1 < upper.size() && upper[id + 1].x == p.x && p.y == upper[id + 1].y)
{
i0 = n - 1, i1 = 1;
return true;
}
}
else if (det(upper[id - 1] - p, upper[id] - p) < 0)
{
get_tan(p, i0, i1);
return true;
}
else if (sgn(det(upper[id - 1] - p, upper[id] - p)) == 0)
{
i0 = (id + lower.size() - 1 + n) % n;
i1 = (i0 - 1 + n) % n;
std::swap(i0, i1);
return true;
}
return false;
}
// 求凸包上和向量 vec 叉积最大的点, 返回编号, 共线的多个切点返回任意一个
int get_tan(point vec)
{
std::pair<LD, int> ret = get_tan(upper, vec);
ret.second = (ret.second + (int) lower.size() - 1) % n;
ret = std::max(ret, get_tan(lower, vec));
return ret.second;
}
bool my_judge_intersect_segment(cp u, cp v)//判断线段与凸包是否有严格相交,即有无穿过内部,默认起点和终点不在凸包内部了
{
int u1, u2;
my_get_tan(u, u1, u2);
if (!turn_left(u, a[u2], v) || !turn_left(u, v, a[u1]))
return false;
my_get_tan(v, u1, u2);
if (!turn_left(v, a[u2], u) || !turn_left(v, u, a[u1]))
return false;
return true;
}
// 求凸包和直线 u,v 的交点, 如果无严格相交返回 false. 如果有则是和 (i,next(i)) 的交点, 两个点无序, 交在点上不确定返回前后两条线段其中之一
bool get_inter(point u, point v, int &i0, int &i1)
{
int p0 = get_tan(u - v), p1 = get_tan(v - u);
if (sgn(det(v - u, a[p0] - u)) * sgn(det(v - u, a[p1] - u)) < 0)
{
if (p0 > p1)std::swap(p0, p1);
i0 = search(u, v, p0, p1);
i1 = search(u, v, p1, p0 + n);
return true;
}
else return false;
}
};
bool in_polygon(cp p, const std::vector<point> &po)//判断点是否在多边形里
{
int n = (int) po.size();
int cnt = 0;
for (int i = 0; i < n; i++)
{
point a = po[i], b = po[(i + 1) % n];
if (point_on_segment(p, line(a, b)))return true;
int x = sgn(det(p - a, b - a)), y = sgn(a.y - p.y), z = sgn(b.y - p.y);
if (x > 0 && y <= 0 && z > 0)++cnt;
if (x < 0 && z <= 0 && y > 0)--cnt;
}
return cnt != 0;
}
bool In_Polygon(cp P, std::vector<point> &polygon)//判断点是否在多边形里面,射线法O(n)
{
bool flag = false; //相当于计数
point P1, P2; //多边形一条边的两个顶点
int n = polygon.size();
for (int i = 0, j = n - 1; i < n; j = i++)
{
//polygon[]是给出多边形的顶点
P1 = polygon[i];
P2 = polygon[j];
if (point_on_segment(P, line(P1, P2)))return true;
//前一个判断min(P1.y,P2.y)<P.y<=max(P1.y,P2.y)
//这个判断代码我觉得写的很精妙 我网上看的 应该是大神模版
//后一个判断被测点 在 射线与边交点 的左边
if ((sgn(P1.y - P.y) > 0 != sgn(P2.y - P.y) > 0) &&
sgn(P.x - (P.y - P1.y) * (P1.x - P2.x) / (P1.y - P2.y) - P1.x) < 0)
flag = !flag;
}
return flag;
}
std::vector<point> Minkovski(std::vector<std::vector<point>> a)//可处理退化成线段的凸包
{ //闵可夫斯基和
std::vector<point> S;
int n = a[0].size(), m = a[1].size();
std::vector<point> A(n), B(m);
for (int i = 0; i < n - 1; i++) A[i] = a[0][i + 1] - a[0][i];
A[n - 1] = a[0][0] - a[0][n - 1];
for (int i = 0; i < m - 1; i++) B[i] = a[1][i + 1] - a[1][i];
B[m - 1] = a[1][0] - a[1][m - 1]; //将两个凸包上的边向量都存入a,b中
S.push_back(a[0][0] + a[1][0]);
int p1 = 0, p2 = 0;
while (p1 < n && p2 < m)
{
LD d = det(A[p1], B[p2]);
if (d > 0)
S.push_back(S.back() + A[p1++]);
else if (d < 0)
S.push_back(S.back() + B[p2++]);
else
{
if (dot(A[p1], B[p1]) >= 0)
S.push_back(S.back() + A[p1++]);
else
{
auto [x, y] = A[p1];
if (x > 0)
S.push_back(S.back() + A[p1++]);
else if (x < 0)
S.push_back(S.back() + B[p2++]);
else
{
if (y > 0)
S.push_back(S.back() + A[p1++]);
else S.push_back(S.back() + B[p2++]);
}
}
}
}
while (p1 < n)
S.push_back(S.back() + A[p1++]);
while (p2 < m)
S.push_back(S.back() + B[p2++]);
return S;
}
LD farthest_pair(std::vector<point> pu)//最远点对
{
pu = convex_hull(pu);
std::vector<std::vector<point>> ppu(2);
std::vector<point> pu1;
for (auto x: pu)
pu1.push_back(x * -1);
pu1 = convex_hull(pu1);
ppu[0] = pu, ppu[1] = pu1;
auto ret = Minkovski(ppu);
LD ans = 0;
for (auto x: ret)
ans = std::max(ans, x.len());
return ans;
}
LD closest_pair(std::vector<point> pu)//最近点对O(nlogn)
{
int n = pu.size();
std::sort(pu.begin(), pu.end());
for (int i = 1; i < n; i++)
if (pu[i] == pu[i - 1])
return 0;
std::set<point, decltype([](cp u, cp v)
{ return u.y == v.y ? u.x < v.x : u.y < v.y; })> s;
LD ans = (pu[0] - pu[1]).len2();
for (int i = 0, j = 0; i < n; i++)
{
if (ans == 0)
break;
auto it = s.begin();
while (!s.empty() && j < i && sqr(pu[i].x - pu[j].x) >= ans)
s.erase(pu[j++]);
auto oit = s.lower_bound(pu[i]);
it = oit;
while (ans)
{
if (it == s.end())
break;
if (sqr(it->y - pu[i].y) >= ans)
break;
ans = std::min(ans, (pu[i] - *it).len2());
it++;
}
it = oit;
while (ans)
{
if (it == s.begin())
break;
it--;
if (sqr(it->y - pu[i].y) >= ans)
break;
ans = std::min(ans, (pu[i] - *it).len2());
}
s.insert(pu[i]);
}
return sqrtl(ans);
}
void print(std::vector<point> res)
{
std::cout << "print:\n";
int cnt = 0;
for (auto [x, y]: res)
std::cout << ++cnt << ' ' << x << ' ' << y << std::endl;
std::cout << "end\n";
}
int onRight(cl a,cp b){return det(a.t-a.s,b-a.s)<=-eps;}//如果要包含点就-eps,不要就eps
/*
丢直线 Ax+By+C<0;
if(sgn(b)==0)
pl.push_back(line(point(-c/a,0),point(-c/a-b,a)));
else pl.push_back(line(point(0,-c/b),point(-b,-c/b+a)));
* */
std::vector<point> my_half_plane(std::vector<line> a)
{
/*要加框取消注释 请注意对于一组解(x,y)x和y是否有要求
a.push_back({{-INF,-INF},{INF,-INF}});
a.push_back({{INF,-INF},{INF,INF}});
a.push_back({{INF,INF},{-INF,INF}});
a.push_back({{-INF,INF},{-INF,-INF}});
*/
std::sort(a.begin(),a.end(),[&](auto x,auto y)
{
point u = x.t - x.s, v = y.t - y.s;
if (u.on_up() != v.on_up())return u.on_up() < v.on_up();
if(sgn(det(u,v)))
return sgn(det(u, v)) > 0;
else return sgn(det(x.t-y.s,y.t-y.s))<0;
});
int n = a.size();
std::vector<line> que(n + 1);
std::vector<point> p1(n + 1);
std::vector<point> p2;
int left = 0, right = 0;
que[0] = a[0];
std::vector<point>sb;
for (int i = 1; i < n; i++)
{
if(sgn(det(a[i].t-a[i].s,a[i-1].t-a[i-1].s))==0)
continue;
while (left < right && onRight(a[i],p1[right]))right--;
while (left < right && onRight(a[i],p1[left+1]))left++;
que[++right] = a[i];
if (std::abs(det(que[right].t - que[right].s, que[right - 1].t - que[right - 1].s)) <= eps)
{
if (onRight(que[right],que[right-1].s) &&
dot(que[right].t-que[right].s,que[right-1].t-que[right-1].s)<=-eps)
return sb;
right--;
if (!onRight(que[right],a[i].s))
que[right] = a[i];
}
if (left < right)p1[right] = line_intersect(que[right], que[right - 1]);
}
while (left < right && onRight(que[left],p1[right]))right--;
if (right - left <= 1)return sb;
p1[left] = line_intersect(que[left], que[right]);
for (int i = left; i <= right; i++)
p2.push_back(p1[i]);
return p2;
}
/*
丢直线 Ax+By+C<0;
if(sgn(b)==0)
pl.push_back(line(point(-c/a,0),point(-c/a-b,a)));
else pl.push_back(line(point(0,-c/b),point(-b,-c/b+a)));
* */
LD get_are(std::vector<point>pu)
{
LD ans=0;
int n=pu.size();
for(int i=0;i<n;i++)
ans+=det(pu[i],pu[(i+1)%n]);
return ans/2;
}
LD get_max_inscribed_circle(const std::vector<point>pu)
{
int n=pu.size();
std::vector<point>dt(n);
for(int i=0;i<n;i++)
dt[i]=((pu[(i+1)%n]-(pu[i]+pu[(i+1)%n])/2).rot90()).unit();
LD l=0,r=1e7;
std::function<bool(LD)>check=[&](LD r)
{
std::vector<line>pl;
for(int i=0;i<n;i++)
pl.push_back({pu[i]+dt[i]*r,pu[(i+1)%n]+dt[i]*r});
auto po= my_half_plane(pl);
return !po.empty();
};
while(r-l>1e-4)
{
LD mid=(r+l)/2;
if(check(mid))
l=mid;
else r=mid;
}
return l;
}
void solve()
{
point p1,p2;
p1.read(),p2.read();
line l1,l2;
l1.read(),l2.read();
if(!intersect_judge(l1,l2)|| intersect_judge_strict(l1,l2))
{
std::cout<<0<<std::endl;
return ;
}
std::vector<line>pl;
pl.push_back(line(p1,point(p2.x,p1.y)));
pl.push_back(line(point(p2.x,p1.y),p2));
pl.push_back(line(p2,point(p1.x,p2.y)));
pl.push_back(line(point(p1.x,p2.y),p1));
if(sgn(det(l1.t-l1.s,l2.t-l2.s))==0)
{
int flag=0;
if(l1.s==l2.s)flag++;
if(l1.s==l2.t)flag++;
if(l1.t==l2.s)flag++;
if(l1.t==l2.t)flag++;
if((l1.t-l1.s).len()>(l2.t-l2.s).len())
std::swap(l1,l2);
if(l1.s>l1.t)
std::swap(l1.s,l1.t);
if(flag==0)
{
std::vector<point>pu;
pu.push_back(l1.s);
pu.push_back(l1.t);
pu.push_back(l2.s);
pu.push_back(l2.t);
std::sort(pu.begin(),pu.end());
l1.s=pu[1];
l1.t=pu[2];
pl.push_back(line(l1.s,l1.s+(l1.s-l1.t).rot90()));
pl.push_back(line(l1.t,l1.t+(l1.t-l1.s).rot90()));
}
else if(flag==1)
{
if(point_on_segment(l1.s,l2)&& point_on_segment(l1.t,l2))
{
if(l1.s==l2.s||l1.s==l2.t)
pl.push_back(line(l1.t,l1.t+(l1.t-l1.s).rot90()));
else pl.push_back(line(l1.s,l1.s+(l1.s-l1.t).rot90()));
}
else
{
std::cout<<0<<std::endl;
return ;
}
}
else
{
std::cout<<(p2.y-p1.y)*(p2.x-p1.x)<<std::endl;
return ;
}
}
else
{
if(l1.s!=l2.s&&l1.t!=l2.s&&l1.s!=l2.t&&l1.t!=l2.t)
{
std::cout<<0<<std::endl;
return ;
}
point base;
if(l1.s==l2.s||l1.s==l2.t)
base=l1.s;
else base=l1.t;
std::vector<point>pu;
if(l1.s!=base)pu.push_back(l1.s);
if(l1.t!=base)pu.push_back(l1.t);
if(l2.s!=base)pu.push_back(l2.s);
if(l2.t!=base)pu.push_back(l2.t);
if(sgn(det(pu[0]-base,pu[1]-base))<0)
std::swap(pu[0],pu[1]);
pl.push_back(line(base,base+(pu[1]-base).rot90()));
pl.push_back(line(base+(base-pu[0]).rot90(),base));
}
std::cout<<get_are(my_half_plane(pl))<<std::endl;
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0), std::cout.tie(0);
std::cout << std::fixed << std::setprecision(9);
int T = 1;
std::cin>>T;
for (int i = 1; i <= T; i++)
solve();
}
这程序好像有点Bug,我给组数据试试?
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3872kb
input:
2 0 0 3 3 1 1 1 2 2 1 2 2 0 0 3 3 1 1 1 2 1 2 2 2
output:
0 1.000000000
result:
ok 2 numbers
Test #2:
score: 0
Accepted
time: 1ms
memory: 4156kb
input:
10 0 0 7 6 2 4 4 4 3 2 5 2 0 0 7 6 2 4 4 4 4 4 5 2 0 0 2 4 1 1 1 2 1 2 1 3 0 0 2 3 1 1 1 2 1 1 1 2 0 0 3 3 1 1 2 2 1 2 2 1 0 0 2 4 1 1 1 2 1 2 1 3 0 0 6 6 1 1 5 5 1 5 3 3 0 0 2 3 1 1 1 2 1 1 1 2 0 0 2 5 1 1 1 3 1 2 1 4 0 0 2 4 1 1 1 3 1 1 1 2
output:
0 3.750000000 0 6.000000000 0 0 0 6.000000000 2.000000000 4.000000000
result:
ok 10 numbers
Test #3:
score: 0
Accepted
time: 120ms
memory: 3972kb
input:
100000 350 720 355 732 353 725 352 729 354 721 353 725 -807 606 -801 621 -803 608 -803 616 -803 616 -803 614 -389 463 -373 466 -382 464 -387 464 -387 464 -385 464 -664 801 -655 806 -656 803 -659 803 -659 803 -657 802 896 -767 901 -762 900 -763 897 -763 900 -763 897 -763 403 645 407 652 406 647 405 6...
output:
0 42.000000000 12.000000000 24.000000000 25.000000000 28.000000000 99.000000000 0 135.000000000 6.000000000 42.000000000 45.000000000 120.000000000 8.000000000 84.000000000 15.000000000 16.000000000 0 36.000000000 4.000000000 0.500000000 20.000000000 1.000000000 0 36.000000000 50.000000000 5.6666666...
result:
ok 100000 numbers
Test #4:
score: 0
Accepted
time: 147ms
memory: 3928kb
input:
100000 -653 -979 -650 -961 -652 -973 -651 -973 -652 -973 -651 -973 -311 -975 -297 -966 -301 -967 -309 -973 -309 -973 -301 -967 734 -459 746 -420 736 -451 743 -440 736 -451 743 -440 127 431 139 456 131 436 138 447 138 447 131 436 -535 293 -505 299 -510 296 -531 297 -510 296 -533 295 571 -397 584 -371...
output:
54.000000000 126.000000000 468.000000000 300.000000000 29.590062112 190.666666667 75.000000000 0 323.000000000 0 0 18.000000000 0 141.289473684 29.307692308 21.000000000 7.750000000 20.000000000 3.100000000 144.000000000 1.583333333 0 0 30.000000000 49.000000000 341.422064777 28.000000000 0 6.000000...
result:
ok 100000 numbers
Test #5:
score: 0
Accepted
time: 159ms
memory: 4160kb
input:
100000 -553 286 -544 299 -551 297 -552 288 -551 297 -548 293 -535 81 -526 122 -534 86 -532 117 -532 117 -534 86 42 -110 54 -94 43 -95 47 -109 47 -109 45 -102 392 33 397 38 395 36 394 37 394 37 395 36 -934 910 -916 933 -924 915 -933 916 -917 921 -933 916 -119 -981 -87 -975 -90 -980 -114 -980 -103 -97...
output:
6.444444444 369.000000000 106.285714286 25.000000000 5.600000000 0 32.000000000 216.000000000 0 99.900000000 0 6.000000000 276.650000000 0 462.000000000 42.000000000 0 0 1710.000000000 0 50.000000000 245.000000000 720.000000000 18.000000000 0 0 0 57.000000000 120.000000000 5.400000000 0 297.00000000...
result:
ok 100000 numbers
Test #6:
score: 0
Accepted
time: 108ms
memory: 4168kb
input:
100000 587 345 644 380 643 368 595 358 643 368 595 358 361 362 367 379 362 373 364 368 364 368 366 363 -418 766 -374 819 -410 796 -403 813 -417 779 -403 813 -536 183 -488 322 -510 238 -521 222 -521 222 -532 304 719 393 812 421 728 417 808 420 728 417 808 420 209 -634 242 -618 231 -623 238 -626 238 -...
output:
1995.000000000 0 1265.647058824 1482.564786585 2604.000000000 528.000000000 384.000000000 481.630769231 0 490.000000000 70.000000000 0 16.000000000 270.000000000 597.454545455 288.000000000 0 1206.625000000 512.000000000 1.076388889 1458.000000000 0 2912.000000000 135.000000000 612.000000000 0 20.83...
result:
ok 100000 numbers
Test #7:
score: 0
Accepted
time: 176ms
memory: 4076kb
input:
100000 -77 35 -66 122 -69 98 -72 81 -72 81 -69 70 -804 257 -551 278 -656 269 -794 277 -656 269 -587 265 -311 610 -280 731 -306 638 -288 700 -306 638 -288 700 -438 472 -433 615 -437 536 -437 499 -437 499 -437 536 -295 -71 -213 39 -275 -29 -238 34 -275 -29 -238 34 589 387 728 432 646 394 631 407 616 4...
output:
5.614973262 0 3751.000000000 715.000000000 9020.000000000 0 14300.000000000 16364.274193548 50801.483870968 16.000000000 0 2493.636363636 280.660714286 44.000000000 185.000000000 935.000000000 9.465909091 56.000000000 4726.000000000 437.100000000 466.877557756 3038.000000000 37.916666667 656.0000000...
result:
ok 100000 numbers
Test #8:
score: 0
Accepted
time: 145ms
memory: 3944kb
input:
100000 -475 589 -253 919 -408 663 -351 817 -408 663 -351 817 524 632 561 857 553 829 556 729 541 765 559 807 -253 -540 -98 -505 -239 -506 -232 -510 -239 -506 -232 -510 -149 639 -51 649 -130 647 -87 644 -130 647 -87 644 719 -478 924 92 916 -66 920 74 910 -276 912 -206 -75 -924 -47 -677 -66 -844 -48 -...
output:
73260.000000000 0 5425.000000000 980.000000000 0 4692.470588235 651.000000000 560.000000000 21645.000000000 1013.246785058 32053.000000000 96819.000000000 31937.175589076 168.000000000 260.000000000 2398.378048780 8256.000000000 0 0 14500.301886792 0 3600.000000000 0 0 71273.000000000 1092.000000000...
result:
ok 100000 numbers
Test #9:
score: 0
Accepted
time: 155ms
memory: 3948kb
input:
100000 -302 -975 987 976 -25 289 396 -1 21 -703 930 -131 -993 -999 968 963 -381 -323 929 583 487 -43 -303 -356 -700 -827 301 846 -366 742 -570 319 -570 319 -638 178 401 -174 675 180 463 -149 455 -131 463 -149 459 -140 -133 -812 454 808 221 176 145 537 121 651 145 537 -334 -930 781 -18 638 -504 279 -...
output:
0 0 0 18936.444444444 0 1016880.000000000 602.170545874 509410.000000000 0 177747.808383234 240642.338709677 369120.778614458 0 538241.000000000 0 0 0 257258.782978723 339529.651578947 477372.244011976 1982880.000000000 197799.945920540 0 0 0 0 0 1793.285714286 1003657.000000000 845043.000000000 984...
result:
ok 100000 numbers
Test #10:
score: 0
Accepted
time: 143ms
memory: 4024kb
input:
100000 -979 -985 824 957 559 390 -209 191 313 140 -209 191 -803 -976 928 979 686 -661 -676 876 686 -661 -676 876 -930 -993 896 995 519 318 -16 230 -16 230 519 318 -625 -850 969 915 540 -88 575 572 526 -352 561 308 -840 -977 839 946 122 -658 -670 403 -670 403 122 -658 -994 -1000 951 1000 383 -468 211...
output:
1351762.309357040 3384105.000000000 3630088.000000000 632999.136363636 3228717.000000000 867642.888888889 0 3506074.000000000 3256160.000000000 3230766.000000000 3144390.000000000 3487424.000000000 0 0 2231056.000000000 3827620.000000000 2734851.414144441 0 2521680.000000000 3394460.000000000 0 913....
result:
ok 100000 numbers
Test #11:
score: 0
Accepted
time: 132ms
memory: 3928kb
input:
100000 -998 -998 997 994 -271 -892 885 154 501 -277 -539 313 -992 -993 977 998 -240 190 -155 863 107 43 -449 362 -992 -1000 996 1000 -498 586 530 -270 -813 478 787 -484 -999 -990 994 999 328 -701 -484 -425 328 -701 -484 -425 -998 -999 997 994 -559 439 929 299 185 369 929 299 -1000 -999 994 999 766 -...
output:
0 0 0 3964077.000000000 1687977.243279570 3984012.000000000 1186.807270149 3769116.000000000 3972033.000000000 2145411.934163701 0 2031273.563218391 769194.258547009 1829984.509090909 2233806.753209700 3958054.000000000 164249.713010204 205535.187740271 3948120.000000000 3952140.000000000 0 3847470....
result:
ok 100000 numbers
Test #12:
score: 0
Accepted
time: 135ms
memory: 3932kb
input:
100000 329 -90 334 -72 332 -89 332 -88 332 -89 332 -88 -211 427 -208 432 -209 428 -210 430 -209 428 -210 430 277 218 283 223 281 222 280 220 281 222 280 220 117 -745 128 -740 118 -744 127 -743 127 -743 118 -744 -438 172 -429 184 -437 177 -431 177 -431 176 -436 177 -406 529 -403 535 -405 530 -405 531...
output:
90.000000000 15.000000000 30.000000000 55.000000000 0 18.000000000 0.666666667 9.000000000 0 11.375000000 1.250000000 15.000000000 352.000000000 0 0 80.000000000 0 12.000000000 56.000000000 0 2.500000000 0 4.000000000 0 2.500000000 5.750000000 6.000000000 156.000000000 0 0 10.000000000 0 54.00000000...
result:
ok 100000 numbers
Test #13:
score: 0
Accepted
time: 121ms
memory: 3952kb
input:
100000 864 -604 868 -586 867 -598 866 -587 867 -601 866 -587 -973 -363 -967 -352 -971 -354 -969 -358 -968 -360 -968 -361 731 -847 734 -835 732 -845 733 -845 733 -845 732 -845 322 -154 356 -147 352 -148 342 -148 345 -148 355 -148 12 -593 16 -571 13 -580 14 -586 15 -592 13 -580 -665 293 -660 296 -663 ...
output:
3.961038961 0 36.000000000 49.000000000 60.000000000 15.000000000 71.500000000 0 40.000000000 36.000000000 104.000000000 24.000000000 12.000000000 48.000000000 0 6.000000000 12.000000000 130.000000000 112.000000000 0.600000000 88.000000000 88.000000000 18.000000000 0 198.000000000 0 112.000000000 70...
result:
ok 100000 numbers
Test #14:
score: 0
Accepted
time: 191ms
memory: 3996kb
input:
100000 11 -579 21 -575 14 -578 15 -576 14 -578 15 -576 638 916 653 935 650 925 650 929 650 918 650 927 207 -519 210 -495 209 -504 209 -499 209 -517 209 -503 -892 533 -879 547 -886 535 -891 545 -886 535 -891 545 24 -431 48 -381 25 -385 45 -415 45 -415 41 -397 -260 675 -253 742 -254 711 -257 731 -257 ...
output:
40.000000000 30.000000000 3.000000000 182.000000000 238.000000000 469.000000000 3.021052632 85.000000000 0 2304.000000000 5.000000000 48.000000000 732.000000000 272.000000000 0 0 0 378.000000000 387.000000000 12.833333333 357.954545455 0 270.000000000 139.714285714 425.000000000 120.000000000 51.000...
result:
ok 100000 numbers
Test #15:
score: 0
Accepted
time: 119ms
memory: 3920kb
input:
100000 233 -984 278 -977 237 -981 238 -979 236 -983 238 -979 612 814 628 829 622 824 627 818 622 824 627 818 948 403 965 406 953 404 951 405 951 405 953 404 -709 840 -551 862 -701 861 -630 847 -630 847 -701 861 536 523 543 534 537 524 541 525 541 525 537 524 -63 -483 -49 -466 -50 -477 -52 -480 -52 -...
output:
290.000000000 240.000000000 51.000000000 3476.000000000 77.000000000 8.571428571 0 1092.000000000 2662.000000000 187.850000000 836.000000000 960.000000000 0 0 861.800000000 2171.714285714 12463.000000000 0 159.250000000 320.000000000 198.000000000 10.941176471 31.711111111 0 225.000000000 77.0416666...
result:
ok 100000 numbers
Test #16:
score: 0
Accepted
time: 148ms
memory: 3952kb
input:
100000 725 209 729 214 727 210 726 211 726 211 727 210 660 -376 740 -226 738 -238 709 -291 738 -238 709 -291 149 -399 200 -264 196 -298 186 -384 196 -298 186 -384 312 -847 455 -765 390 -772 426 -813 426 -813 390 -772 947 -739 957 -632 956 -685 955 -693 955 -693 950 -733 -30 -883 -23 -878 -29 -882 -2...
output:
20.000000000 12000.000000000 6885.000000000 11726.000000000 0 8.000000000 612.000000000 0 1180.000000000 19234.000000000 0 0 0 5896.000000000 0 3213.000000000 492.000000000 0 0 1838.200000000 0 0 450.000000000 8700.000000000 5885.000000000 240.000000000 882.000000000 0 6678.000000000 0 2633.27272727...
result:
ok 100000 numbers
Test #17:
score: 0
Accepted
time: 150ms
memory: 3916kb
input:
100000 -382 62 -103 103 -249 90 -246 99 -155 84 -246 99 -216 2 -111 48 -209 5 -153 3 -140 32 -166 39 -266 326 -109 379 -183 354 -208 346 -208 346 -183 354 -398 -169 327 192 -305 69 190 -164 -305 69 190 -164 -611 -877 -385 -717 -529 -784 -413 -775 -529 -784 -413 -775 -356 -68 -258 -48 -279 -49 -336 -...
output:
25.318681319 0 8321.000000000 261725.000000000 36160.000000000 0 148708.000000000 1048.684210526 33420.558139535 23546.000000000 6453.847807018 1156.000000000 17.964912281 629.787037037 24010.836363636 2430.000000000 0 3251.306250000 1090.400000000 55647.000000000 0 8321.000000000 645.250000000 1022...
result:
ok 100000 numbers
Test #18:
score: 0
Accepted
time: 155ms
memory: 4080kb
input:
100000 -670 -906 906 875 76 659 787 -116 787 -116 76 659 -512 346 718 508 87 409 344 492 657 449 344 492 -129 -479 474 487 234 -281 374 -23 29 357 164 -410 -370 -981 -168 987 -310 377 -198 -801 -310 377 -224 985 -919 -182 943 834 -465 389 -403 402 -403 402 -217 441 -550 -982 -534 418 -542 -847 -542 ...
output:
2806856.000000000 58.923185938 0 425.742784380 0 22400.000000000 415800.000000000 0 813732.000000000 1094143.940774487 442188.000000000 0 0 0 62167.339805825 1417705.404538578 0 495772.681017613 0 19473.311514505 1050141.585053671 131498.586427661 89262.000000000 197143.232499365 1458016.000000000 1...
result:
ok 100000 numbers
Test #19:
score: 0
Accepted
time: 163ms
memory: 4020kb
input:
100000 -1000 -857 805 872 303 182 -659 649 -659 649 303 182 -983 -960 901 944 -346 -598 -518 380 -432 -109 -604 869 -997 -952 965 920 733 -238 -389 -846 733 -238 -389 -846 -956 -970 980 994 -247 824 -479 664 -566 604 -305 784 -975 -746 883 894 -338 217 -827 497 -827 497 151 -63 -791 -588 946 900 202...
output:
3120845.000000000 949771.018404908 3672864.000000000 504273.931034483 910394.519427403 2584656.000000000 0 3346200.000000000 3722814.000000000 0 3455808.000000000 3381192.000000000 3000370.000000000 0 0 453073.424668630 1196461.746293245 446688.221084169 0 147342.416729400 122660.997815267 854498.60...
result:
ok 100000 numbers
Test #20:
score: 0
Accepted
time: 147ms
memory: 3864kb
input:
100000 -1000 -999 1000 998 339 -905 140 -133 140 -133 657 231 -992 -982 991 998 -250 -429 -135 -67 -365 -791 -250 -429 -966 -976 980 981 303 -92 106 -551 303 -92 106 -551 -997 -992 996 997 793 744 -740 -330 282 386 -229 28 -1000 -999 999 993 333 573 -767 222 333 573 -767 222 -981 -985 999 993 -273 -...
output:
1006535.999879737 0 3808322.000000000 1470130.783216172 3982008.000000000 298549.565217391 3548251.882853929 1288381.266080378 3876561.000000000 0 253344.000000000 0 0 49050.532368970 464519.025452179 3924280.000000000 3172778.508370146 0 3936112.000000000 1566180.000000000 3926232.000000000 3922074...
result:
ok 100000 numbers
Test #21:
score: 0
Accepted
time: 131ms
memory: 4020kb
input:
100000 52 -610 56 -606 54 -608 55 -607 55 -608 53 -607 -353 -35 -349 -31 -351 -32 -351 -34 -352 -33 -351 -32 839 -323 842 -313 841 -321 840 -318 841 -321 840 -318 938 -62 941 -58 940 -61 939 -60 940 -61 939 -60 -702 416 -699 423 -700 419 -700 417 -700 419 -700 417 -337 349 -332 353 -333 351 -333 350...
output:
0 2.500000000 30.000000000 12.000000000 21.000000000 10.000000000 9.000000000 1.500000000 7.000000000 0 18.000000000 36.000000000 24.000000000 9.000000000 5.000000000 0 21.000000000 30.000000000 12.000000000 9.500000000 0 20.000000000 10.000000000 35.000000000 16.000000000 63.000000000 42.000000000 ...
result:
ok 100000 numbers
Test #22:
score: 0
Accepted
time: 138ms
memory: 4024kb
input:
100000 -537 167 -533 182 -534 180 -534 173 -534 176 -534 180 -165 -532 -131 -523 -161 -525 -157 -524 -157 -524 -161 -525 899 556 904 564 901 560 900 561 900 561 902 559 -931 542 -914 549 -930 543 -926 543 -930 543 -918 543 807 -892 816 -876 815 -885 814 -881 815 -885 814 -881 597 -596 606 -579 600 -...
output:
24.000000000 306.000000000 17.500000000 35.000000000 144.000000000 153.000000000 52.000000000 0 0 36.000000000 56.000000000 4.375000000 0 172.000000000 20.000000000 0 161.000000000 40.000000000 98.850000000 11.716666667 112.000000000 56.000000000 238.000000000 0 32.000000000 756.000000000 0 0 199.50...
result:
ok 100000 numbers
Test #23:
score: 0
Accepted
time: 155ms
memory: 4024kb
input:
100000 -162 86 -148 92 -154 87 -150 91 -160 91 -154 87 160 -125 167 -121 161 -122 165 -124 161 -122 164 -122 -635 366 -618 382 -620 374 -622 378 -623 380 -621 376 615 -689 632 -668 631 -676 621 -680 631 -676 621 -680 -278 61 -273 87 -277 69 -275 84 -275 84 -277 69 289 534 301 547 299 545 292 544 299...
output:
0.833333333 2.000000000 42.500000000 357.000000000 130.000000000 156.000000000 33.000000000 17.378571429 154.000000000 36.000000000 24.000000000 32.000000000 0 8.041666667 506.000000000 0 177.896739130 26.666666667 434.000000000 742.000000000 109.375000000 3.000000000 232.000000000 0 0 0 0 2146.0000...
result:
ok 100000 numbers
Test #24:
score: 0
Accepted
time: 141ms
memory: 4160kb
input:
100000 -27 318 2 328 -3 320 -23 326 -23 326 -3 320 444 632 486 691 484 638 458 686 471 662 484 638 -630 909 -627 954 -628 912 -629 918 -629 918 -628 912 -393 509 -389 559 -390 532 -390 510 -390 532 -390 510 945 -907 964 -866 952 -869 951 -896 949 -875 956 -877 272 584 286 615 276 599 273 602 276 599...
output:
290.000000000 1123.500000000 135.000000000 200.000000000 0 218.666666667 0 400.000000000 0 2275.000000000 1152.000000000 54.000000000 169.763157895 167.142857143 34.000000000 2.625000000 0 2480.000000000 0 396.000000000 2262.000000000 315.000000000 175.000000000 390.000000000 1719.720279720 857.8125...
result:
ok 100000 numbers
Test #25:
score: 0
Accepted
time: 150ms
memory: 3888kb
input:
100000 -48 216 12 300 -42 226 2 269 2 269 -42 226 449 -897 523 -671 511 -707 503 -724 452 -743 495 -741 -132 -959 -58 -943 -83 -948 -113 -947 -69 -956 -113 -947 199 -522 296 -129 228 -308 255 -426 255 -426 228 -308 337 -855 388 -818 355 -852 366 -840 366 -840 355 -852 727 712 924 817 736 814 795 773...
output:
5040.000000000 0 289.539393939 38121.000000000 1887.000000000 0 3160.000000000 204.500000000 0 20114.000000000 0 814.000000000 397.401666667 13585.714285714 0 217.692307692 242.857142857 0 57528.000000000 307.795454545 242.000000000 0 2371.588235294 3952.000000000 702.800000000 4.392857143 512.58823...
result:
ok 100000 numbers
Test #26:
score: 0
Accepted
time: 182ms
memory: 3928kb
input:
100000 69 -124 92 -99 90 -103 89 -117 90 -103 89 -117 569 -330 587 -111 572 -194 580 -119 572 -194 580 -119 457 468 830 914 753 680 621 606 489 532 621 606 462 -15 551 70 521 -1 506 -1 504 -1 476 -1 -29 152 111 582 3 254 -1 441 34 335 36 484 -367 -578 -362 -150 -364 -245 -365 -458 -365 -458 -364 -24...
output:
575.000000000 3942.000000000 0 0 0 2140.000000000 21010.000000000 18444.000000000 28665.000000000 0 14000.000000000 3336.000000000 8482.500000000 17800.000000000 66286.000000000 3822.000000000 55552.000000000 18285.000000000 96.000000000 13443.428571429 18354.090909091 0 319.407407407 269.361471861 ...
result:
ok 100000 numbers
Test #27:
score: 0
Accepted
time: 176ms
memory: 4020kb
input:
100000 -935 -289 -491 868 -614 -6 -860 344 -860 344 -614 -6 -283 -623 420 999 -36 -349 -80 -442 -124 -535 8 -256 -378 -817 55 914 -127 -314 -37 633 -127 -314 -37 633 -249 -550 754 889 509 -515 287 62 509 -515 65 639 -987 -629 887 286 810 -560 301 -383 301 -383 810 -560 -836 -839 132 745 -661 -812 -2...
output:
513708.000000000 76751.289222874 749523.000000000 600522.348353553 1714710.000000000 1533312.000000000 0 0 0 100436.000000000 430802.452471483 0 594520.000000000 1225296.000000000 1088724.000000000 0 1184592.000000000 504000.000000000 859214.000000000 1345408.000000000 205049.345744681 0 198385.1130...
result:
ok 100000 numbers
Test #28:
score: 0
Accepted
time: 147ms
memory: 4024kb
input:
100000 -967 -986 989 976 60 -380 -347 453 60 -380 -347 453 -943 -995 933 978 887 410 -500 -140 887 410 -500 -140 -870 -835 977 994 181 -581 823 -821 823 -821 181 -581 -985 -832 772 915 -551 402 214 884 -551 402 214 884 -969 -820 988 965 478 326 551 34 420 558 551 34 -988 -344 997 877 -942 -184 -881 ...
output:
3837672.000000000 3701348.000000000 3378163.000000000 3069479.000000000 2013508.375000000 2423685.000000000 0 91400.579717357 3743904.000000000 700867.697717883 370580.458869078 0 106662.215302938 0 3922368.000000000 333909.225792502 3710304.000000000 1823880.559544658 3090988.000000000 0 1109919.53...
result:
ok 100000 numbers
Test #29:
score: 0
Accepted
time: 155ms
memory: 4040kb
input:
100000 -992 -991 993 999 -287 723 -688 -530 -688 -530 -287 723 -999 -1000 1000 1000 -841 -413 137 359 626 745 -352 -27 -997 -1000 997 986 -77 222 -133 959 -133 959 -77 222 -1000 -996 998 978 616 432 793 -930 616 432 793 -930 -1000 -994 977 965 776 -646 970 690 873 22 970 690 -973 -982 993 999 -796 8...
output:
3950150.000000000 1542553.845190036 3960084.000000000 3944052.000000000 1610389.322604790 3894646.000000000 3830324.000000000 1834613.214470284 256920.086896718 0 0 3986006.000000000 3990000.000000000 0 0 3874290.000000000 3876880.000000000 147406.578149468 278190.712165593 3934272.000000000 1405011...
result:
ok 100000 numbers
Test #30:
score: 0
Accepted
time: 162ms
memory: 3860kb
input:
100000 757 -469 768 -466 763 -467 759 -468 759 -468 763 -467 -860 -809 -842 -799 -859 -802 -849 -804 -854 -803 -844 -805 -580 -402 -576 -398 -579 -400 -579 -399 -577 -399 -579 -400 -615 364 -599 375 -605 368 -607 373 -605 368 -607 373 141 -198 160 -187 146 -193 150 -190 142 -196 146 -193 -521 -135 -...
output:
33.000000000 52.000000000 3.000000000 176.000000000 0 20.633333333 35.000000000 5.000000000 12.000000000 12.000000000 90.000000000 44.000000000 12.000000000 48.000000000 15.950000000 19.416666667 156.000000000 0 0 6.000000000 10.000000000 40.000000000 48.000000000 0 153.000000000 0 0 85.833333333 12...
result:
ok 100000 numbers
Test #31:
score: 0
Accepted
time: 129ms
memory: 3996kb
input:
100000 24 -943 45 -937 33 -939 31 -940 31 -940 29 -941 24 -407 47 -374 26 -397 40 -382 30 -405 26 -397 -338 -401 -335 -398 -337 -399 -336 -399 -337 -399 -336 -399 -186 554 -141 558 -151 555 -176 556 -151 555 -176 556 -624 109 -617 177 -621 175 -620 157 -622 137 -619 139 -930 -172 -903 -158 -911 -161...
output:
0 2.866666667 9.000000000 180.000000000 0 154.000000000 0 263.500000000 238.000000000 374.000000000 1242.958333333 23.980769231 144.000000000 0 0 551.000000000 0 81.000000000 310.000000000 15.000000000 42.000000000 96.000000000 4.000000000 0 0 375.000000000 0 150.000000000 0 928.000000000 0 19.20000...
result:
ok 100000 numbers
Test #32:
score: 0
Accepted
time: 150ms
memory: 4024kb
input:
100000 -907 -546 -898 -457 -902 -502 -901 -463 -902 -502 -901 -463 -366 -693 -359 -646 -363 -663 -364 -665 -361 -659 -364 -665 373 -119 390 -110 378 -111 385 -111 376 -111 388 -111 -737 -682 -720 -679 -728 -680 -729 -680 -727 -681 -729 -680 695 214 731 263 723 247 700 218 711 219 709 250 482 -243 48...
output:
801.000000000 208.250000000 63.000000000 23.000000000 0 84.000000000 810.000000000 0 1860.000000000 1656.000000000 56.000000000 204.000000000 290.000000000 1010.000000000 13.520833333 156.000000000 867.000000000 2950.000000000 18.000000000 0 282.000000000 9.000000000 499.218750000 64.000000000 33.33...
result:
ok 100000 numbers
Test #33:
score: 0
Accepted
time: 150ms
memory: 4144kb
input:
100000 -737 590 -688 597 -732 595 -731 596 -732 595 -736 591 24 -730 52 -476 35 -564 34 -652 35 -564 34 -652 480 -273 562 -155 530 -248 511 -272 530 -248 549 -224 -370 -155 -355 -22 -368 -152 -364 -46 -364 -76 -367 -23 430 827 489 899 454 840 432 869 432 869 473 847 -310 -126 -179 -27 -204 -36 -281 ...
output:
0 7112.000000000 0 0 302.980656013 12969.000000000 3645.000000000 132.000000000 5.954861111 29016.000000000 0 31987.593750000 5022.000000000 112.559055809 0 1.125000000 5349.175000000 7920.000000000 0 1360.644664466 475.333333333 492.375831486 0 2751.000000000 10329.462962963 0 0.975000000 4976.5000...
result:
ok 100000 numbers
Test #34:
score: 0
Accepted
time: 164ms
memory: 3944kb
input:
100000 -717 -894 -455 -770 -597 -886 -533 -836 -533 -836 -565 -861 -798 -326 -742 75 -782 -234 -759 -35 -782 -234 -759 -35 113 -696 295 -596 277 -641 217 -650 117 -665 177 -656 280 -873 734 -751 733 -843 427 -863 344 -796 427 -863 -685 -613 -543 -590 -598 -601 -596 -612 -596 -612 -567 -595 734 309 9...
output:
16449.375000000 22456.000000000 0 43.629419639 3.043103448 872.347321429 39611.000000000 17.045454545 0 5594.575357536 0 36295.724137931 7812.000000000 15811.000000000 0 0 38318.995014245 0 0 3822.875000000 22888.861559140 2808.000000000 1796.184090909 21867.391304348 15620.000000000 0 12850.0000000...
result:
ok 100000 numbers
Test #35:
score: 0
Accepted
time: 147ms
memory: 3876kb
input:
100000 -935 -968 975 962 310 93 414 637 219 -383 115 -927 -998 -975 937 981 390 157 -401 -464 390 157 -401 -464 -995 -419 994 865 -281 846 -197 -136 -197 -136 -239 355 -975 -964 998 941 -576 -35 -328 781 -359 679 -328 781 -983 -938 927 845 159 -827 528 481 282 -391 405 45 -982 -967 951 970 804 -685 ...
output:
0 3784860.000000000 1580064.030549898 739091.602941176 899036.123853211 66224.352257012 0 3430916.000000000 2071579.180743243 245252.309977843 643532.427184466 3323293.000000000 3347344.000000000 0 0 4229.381075082 2317345.000000000 0 3371019.000000000 3519488.000000000 2910075.000000000 1963745.302...
result:
ok 100000 numbers