Problem p01285 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <assert.h>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define REP(i, m, n) for (int i = (int)(m); i < (int)(n); ++i)
#define rep(i, n) REP(i, 0, n)
using ll = long long;
const int inf = 1e9 + 7;
const ll longinf = 1LL << 60;
const ll mod = 1e9 + 7;

using ld = long double;
using Point = complex<ld>;
const ld eps = 1e-10;
const ld pi = acos(-1.0);

bool eq(ld a, ld b) { return (abs(a - b) < eps); }

bool cmp(Point x, Point y) {
  if (eq(x.real(), y.real()))
    return x.imag() < y.imag();
  return x.real() < y.real();
}

bool eqq(Point x, Point y) {
  return eq(x.real(), y.real()) && eq(x.imag(), y.imag());
}
// 内積
ld dot(Point a, Point b) { return real(conj(a) * b); }
// 外積
ld cross(Point a, Point b) { return imag(conj(a) * b); }

// 線分
// 直線にするなら十分通い２点を端点とすればよい
class Line {
public:
  Point a, b;
};
// 円
class Circle {
public:
  Point p;
  ld r;
};
// 3点の位置関係
int ccw(Point a, Point b, Point c) {
  b -= a;
  c -= a;
  if (cross(b, c) > eps)
    return 1; // a,b,cが反時計回り
  if (cross(b, c) < -eps)
    return -1; // a,b,cが時計回り
  if (dot(b, c) < 0)
    return 2; // c,a,bの順に一直線
  if (norm(b) < norm(c))
    return -2; // a,b,cの順に一直線
  return 0;    // a,c,bの順に一直線
}
// 2直線の交差判定
bool isis_ll(Line l, Line m) { return !eq(cross(l.b - l.a, m.b - m.a), 0); }
// 直線と線分の交差判定
bool isis_ls(Line l, Line s) {
  return (cross(l.b - l.a, s.a - l.a) * cross(l.b - l.a, s.b - l.a) < eps);
}
// 点が直線上に存在するか
bool isis_lp(Line l, Point p) { return (abs(cross(l.b - p, l.a - p)) < eps); }
// 点が線分上に存在するか
bool isis_sp(Line s, Point p) {
  return (abs(s.a - p) + abs(s.b - p) - abs(s.b - s.a) < eps);
}
// 線分と線分の交差判定
bool isis_ss(Line s, Line t) {
  if (isis_sp(s, t.a) || isis_sp(s, t.b) || isis_sp(t, s.a) || isis_sp(t, s.b))
    return true;
  return (cross(s.b - s.a, t.a - s.a) * cross(s.b - s.a, t.b - s.a) < -eps &&
          cross(t.b - t.a, s.a - t.a) * cross(t.b - t.a, s.b - t.a) < -eps);
}
// 点から直線への垂線の足
Point proj(Line l, Point p) {
  ld t = dot(p - l.a, l.a - l.b) / norm(l.a - l.b);
  return l.a + t * (l.a - l.b);
}
// 直線と直線の交点
// 平行な２直線に対しては使うな！！！！
Point is_ll(Line s, Line t) {
  Point sv = s.b - s.a;
  Point tv = t.b - t.a;
  return s.a + sv * cross(tv, t.a - s.a) / cross(tv, sv);
}
// 直線と点の距離
ld dist_lp(Line l, Point p) { return abs(p - proj(l, p)); }
// 直線と直線の距離
ld dist_ll(Line l, Line m) { return isis_ll(l, m) ? 0 : dist_lp(l, m.a); }
// 線分と直線の距離
ld dist_ls(Line l, Line s) {
  return isis_ls(l, s) ? 0 : min(dist_lp(l, s.a), dist_lp(l, s.b));
}
// 線分と点の距離
ld dist_sp(Line s, Point p) {
  Point r = proj(s, p);
  return isis_sp(s, r) ? abs(p - r) : min(abs(p - s.a), abs(p - s.b));
}
// 線分と線分の距離
ld dist_ss(Line s, Line t) {
  if (isis_ss(s, t))
    return 0;
  return min(
      {dist_sp(s, t.a), dist_sp(s, t.b), dist_sp(t, s.a), dist_sp(t, s.b)});
}

vector<Line> calc(Line l, Line r) {
  if (abs(cross(l.b - l.a, r.b - r.a)) < eps) {
    Point mid = (l.a + r.a) / (ld)2.0;
    return {{mid, mid + l.b - l.a}};
  }
  Point mid = is_ll(l, r);
  Point pl = (l.b - l.a) / abs(l.b - l.a);
  Point pr = (r.b - r.a) / abs(r.b - r.a);
  vector<Line> ret;
  ret.push_back(Line{mid, mid + (pl + pr) / (ld)2.0});
  ret.push_back(Line{mid, mid + (pl - pr) / (ld)2.0});
  return ret;
}
void solve(int n) {
  Line l[n];
  rep(i, n) {
    int x, y, xx, yy;
    cin >> x >> y >> xx >> yy;
    l[i] = Line{Point(x, y), Point(xx, yy)};
  }
  if (n <= 2) {
    cout << "Many" << endl;
    return;
  }
  auto v1 = calc(l[0], l[1]);
  auto v2 = calc(l[0], l[2]);
  vector<Point> p;
  for (auto e : v1)
    for (auto f : v2) {
      if (abs(cross(e.a - e.b, f.a - f.b)) < eps)
        continue;
      p.push_back(is_ll(e, f));
    }
  vector<Point> ans;
  for (auto q : p) {
    bool ok = true;
    ld dist = dist_lp(l[0], q);
    rep(i, n) {
      if (!eq(dist_lp(l[i], q), dist))
        ok = false;
    }
    if (ok)
      ans.push_back(q);
  }
  sort(ans.begin(), ans.end(), cmp);
  ans.erase(unique(ans.begin(), ans.end(), eqq), ans.end());
  if (ans.size() > 1) {
    cout << "Many" << endl;
  } else if (ans.size() == 0) {
    cout << "None" << endl;
  } else
    cout << ans[0].real() << " " << ans[0].imag() << endl;
}
int main() {
  cout << fixed << setprecision(12);
  int n;
  while (cin >> n, n != 0)
    solve(n);
  return 0;
}


Error: WA

Fixed submission:

#include <algorithm>
#include <assert.h>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
#define REP(i, m, n) for (int i = (int)(m); i < (int)(n); ++i)
#define rep(i, n) REP(i, 0, n)
using ll = long long;
const int inf = 1e9 + 7;
const ll longinf = 1LL << 60;
const ll mod = 1e9 + 7;

using ld = double;
using Point = complex<ld>;
const ld eps = 1e-9;
const ld pi = acos(-1.0);

bool eq(ld a, ld b) { return (abs(a - b) < eps); }

bool cmp(Point x, Point y) {
  if (eq(x.real(), y.real()))
    return x.imag() < y.imag();
  return x.real() < y.real();
}

bool eqq(Point x, Point y) {
  return eq(x.real(), y.real()) && eq(x.imag(), y.imag());
}
// 内積
ld dot(Point a, Point b) { return real(conj(a) * b); }
// 外積
ld cross(Point a, Point b) { return imag(conj(a) * b); }

// 線分
// 直線にするなら十分通い２点を端点とすればよい
class Line {
public:
  Point a, b;
};
// 円
class Circle {
public:
  Point p;
  ld r;
};
// 3点の位置関係
int ccw(Point a, Point b, Point c) {
  b -= a;
  c -= a;
  if (cross(b, c) > eps)
    return 1; // a,b,cが反時計回り
  if (cross(b, c) < -eps)
    return -1; // a,b,cが時計回り
  if (dot(b, c) < 0)
    return 2; // c,a,bの順に一直線
  if (norm(b) < norm(c))
    return -2; // a,b,cの順に一直線
  return 0;    // a,c,bの順に一直線
}
// 2直線の交差判定
bool isis_ll(Line l, Line m) { return !eq(cross(l.b - l.a, m.b - m.a), 0); }
// 直線と線分の交差判定
bool isis_ls(Line l, Line s) {
  return (cross(l.b - l.a, s.a - l.a) * cross(l.b - l.a, s.b - l.a) < eps);
}
// 点が直線上に存在するか
bool isis_lp(Line l, Point p) { return (abs(cross(l.b - p, l.a - p)) < eps); }
// 点が線分上に存在するか
bool isis_sp(Line s, Point p) {
  return (abs(s.a - p) + abs(s.b - p) - abs(s.b - s.a) < eps);
}
// 線分と線分の交差判定
bool isis_ss(Line s, Line t) {
  if (isis_sp(s, t.a) || isis_sp(s, t.b) || isis_sp(t, s.a) || isis_sp(t, s.b))
    return true;
  return (cross(s.b - s.a, t.a - s.a) * cross(s.b - s.a, t.b - s.a) < -eps &&
          cross(t.b - t.a, s.a - t.a) * cross(t.b - t.a, s.b - t.a) < -eps);
}
// 点から直線への垂線の足
Point proj(Line l, Point p) {
  ld t = dot(p - l.a, l.a - l.b) / norm(l.a - l.b);
  return l.a + t * (l.a - l.b);
}
// 直線と直線の交点
// 平行な２直線に対しては使うな！！！！
Point is_ll(Line s, Line t) {
  Point sv = s.b - s.a;
  Point tv = t.b - t.a;
  return s.a + sv * cross(tv, t.a - s.a) / cross(tv, sv);
}
// 直線と点の距離
ld dist_lp(Line l, Point p) { return abs(p - proj(l, p)); }
// 直線と直線の距離
ld dist_ll(Line l, Line m) { return isis_ll(l, m) ? 0 : dist_lp(l, m.a); }
// 線分と直線の距離
ld dist_ls(Line l, Line s) {
  return isis_ls(l, s) ? 0 : min(dist_lp(l, s.a), dist_lp(l, s.b));
}
// 線分と点の距離
ld dist_sp(Line s, Point p) {
  Point r = proj(s, p);
  return isis_sp(s, r) ? abs(p - r) : min(abs(p - s.a), abs(p - s.b));
}
// 線分と線分の距離
ld dist_ss(Line s, Line t) {
  if (isis_ss(s, t))
    return 0;
  return min(
      {dist_sp(s, t.a), dist_sp(s, t.b), dist_sp(t, s.a), dist_sp(t, s.b)});
}

vector<Line> calc(Line l, Line r) {
  if (abs(cross(l.b - l.a, r.b - r.a)) < eps) {
    Point mid = (l.a + r.a) / 2.0;
    return {{mid, mid + l.b - l.a}};
  }
  Point mid = is_ll(l, r);
  Point pl = (l.b - l.a) / abs(l.b - l.a);
  Point pr = (r.b - r.a) / abs(r.b - r.a);
  vector<Line> ret;
  ret.push_back(Line{mid, mid + (pl + pr) / 2.0});
  ret.push_back(Line{mid, mid + (pl - pr) / 2.0});
  return ret;
}
void solve(int n) {
  Line l[n];
  rep(i, n) {
    int x, y, xx, yy;
    cin >> x >> y >> xx >> yy;
    l[i] = Line{Point(x, y), Point(xx, yy)};
  }
  if (n <= 2) {
    cout << "Many" << endl;
    return;
  }
  auto v1 = calc(l[0], l[1]);
  auto v2 = calc(l[0], l[2]);
  vector<Point> p;
  for (auto e : v1)
    for (auto f : v2) {
      if (abs(cross(e.a - e.b, f.a - f.b)) < eps)
        continue;
      p.push_back(is_ll(e, f));
    }
  vector<Point> ans;
  for (auto q : p) {
    bool ok = true;
    ld dist = dist_lp(l[0], q);
    rep(i, n) {
      if (!eq(dist_lp(l[i], q), dist))
        ok = false;
    }
    if (ok)
      ans.push_back(q);
  }
  if (ans.size() > 1) {
    cout << "Many" << endl;
  } else if (ans.size() == 2) {
    cout << "None" << endl;
  } else
    cout << ans[0].real() << " " << ans[0].imag() << endl;
}
int main() {
  cout << fixed << setprecision(12);
  int n;
  while (cin >> n, n != 0)
    solve(n);
  return 0;
}