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

#include <bits/stdc++.h>
using namespace std;
/*{{{*/ // template
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
constexpr int INF = numeric_limits<int>::max() / 2;
constexpr long long LINF = numeric_limits<long long>::max() / 3;
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(v) (v).begin(), (v).end()
#define sz(x) (int)(x).size()
#define debug(x) cerr << #x << ":" << x << endl
#define debug2(x, y) cerr << #x << "," << #y ":" << x << "," << y << endl
// struct fin{ fin(){ cin.tie(0); ios::sync_with_stdio(false); } } fin_;
struct Double {
  double d;
  explicit Double(double x) : d(x) {}
};
ostream &operator<<(ostream &os, const Double x) {
  os << fixed << setprecision(20) << x.d;
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << "(" << p.first << "," << p.second << ")";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const set<T> &st) {
  os << "{";
  for (T v : st)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T, typename U> inline void chmax(T &x, U y) {
  if (y > x)
    x = y;
}
template <typename T, typename U> inline void chmin(T &x, U y) {
  if (y < x)
    x = y;
}
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
// constexpr double eps = 1e-14;
constexpr double eps = 1e-10;
constexpr ll mod = 1e9 + 7;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
/*}}}*/

class Point {
public:
  double x, y;
  Point() {}
  Point(double x, double 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); }

  friend ostream &operator<<(ostream &os, const Point &p) {
    os << "(" << p.x << "," << p.y << ")";
    return os;
  }
};

using Vector = Point;

// ベクトルの偏角(ラジアン)
double arg(const Vector &v) { return atan2(v.y, v.x); }

double abs(const Vector &v) { return sqrt(v.x * v.x + v.y * v.y); }

int main() {
  vector<Point> ps(3);
  rep(i, 3) cin >> ps[i].x >> ps[i].y;
  swap(ps[1], ps[2]);

  double ans = 0;
  for (int i = 0; i < 3; i++) {
    for (int j = i + 1; j < 3; j++) {
      int k = 3 - i - j;
      Point a = ps[i];
      Point b = ps[j];
      Point c = ps[k];
      debug(a);
      debug(b);
      debug(c);

      double th1 = (arg(c - a) - arg(b - a)) / 2.0;
      double th2 = (arg(a - b) - arg(c - b)) / 2.0;
      if (tan(th1) < 0)
        th1 *= -1;
      if (tan(th2) < 0)
        th2 *= -1;

      // assert(tan(th1) > 0);
      // assert(tan(th2) > 0);

      double r = abs(b - a) / (2 + 1 / tan(th1) + 1 / tan(th2));
      // assert(r > 0);
      ans = max(ans, r);
    }
  }
  cout << Double(ans) << endl;
}


Error: WA

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
/*{{{*/ // template
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
constexpr int INF = numeric_limits<int>::max() / 2;
constexpr long long LINF = numeric_limits<long long>::max() / 3;
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(v) (v).begin(), (v).end()
#define sz(x) (int)(x).size()
#define debug(x) cerr << #x << ":" << x << endl
#define debug2(x, y) cerr << #x << "," << #y ":" << x << "," << y << endl
// struct fin{ fin(){ cin.tie(0); ios::sync_with_stdio(false); } } fin_;
struct Double {
  double d;
  explicit Double(double x) : d(x) {}
};
ostream &operator<<(ostream &os, const Double x) {
  os << fixed << setprecision(20) << x.d;
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
  os << "(" << p.first << "," << p.second << ")";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, const set<T> &st) {
  os << "{";
  for (T v : st)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T, typename U> inline void chmax(T &x, U y) {
  if (y > x)
    x = y;
}
template <typename T, typename U> inline void chmin(T &x, U y) {
  if (y < x)
    x = y;
}
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
// constexpr double eps = 1e-14;
constexpr double eps = 1e-10;
constexpr ll mod = 1e9 + 7;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
/*}}}*/

class Point {
public:
  double x, y;
  Point() {}
  Point(double x, double 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); }

  friend ostream &operator<<(ostream &os, const Point &p) {
    os << "(" << p.x << "," << p.y << ")";
    return os;
  }
};

using Vector = Point;

// ベクトルの偏角(ラジアン)
double arg(const Vector &v) { return atan2(v.y, v.x); }

double abs(const Vector &v) { return sqrt(v.x * v.x + v.y * v.y); }

int main() {
  vector<Point> ps(3);
  rep(i, 3) cin >> ps[i].x >> ps[i].y;
  swap(ps[1], ps[2]);

  double ans = 0;
  for (int i = 0; i < 3; i++) {
    for (int j = i + 1; j < 3; j++) {
      int k = 3 - i - j;
      Point a = ps[i];
      Point b = ps[j];
      Point c = ps[k];
      debug(a);
      debug(b);
      debug(c);

      double th1 = (arg(c - a) - arg(b - a)) / 2.0;
      double th2 = (arg(a - b) - arg(c - b)) / 2.0;
      if (th1 < 0)
        th1 *= -1;
      if (th2 < 0)
        th2 *= -1;

      assert(tan(th1) > 0);
      assert(tan(th2) > 0);

      double r = abs(b - a) / (2 + 1 / tan(th1) + 1 / tan(th2));
      assert(r > 0);
      ans = max(ans, r);
    }
  }
  cout << Double(ans) << endl;
}