Problem p03004 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#ifdef LOCAL_DEBUG
#define DEBUG 1
#define CERR                                                                   \
  if (DEBUG)                                                                   \
  cerr
#define MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, NAME, ...) NAME
#define pr(...)                                                                \
  CERR << MACRO(__VA_ARGS__, pr10, pr9, pr8, pr7, pr6, pr5, pr4, pr3, pr2,     \
                pr1)(__VA_ARGS__)                                              \
       << endl
#define pr1(a) (#a) << "=" << (a) << " "
#define pr2(a, b) pr1(a) << pr1(b)
#define pr3(a, b, c) pr1(a) << pr2(b, c)
#define pr4(a, b, c, d) pr1(a) << pr3(b, c, d)
#define pr5(a, b, c, d, e) pr1(a) << pr4(b, c, d, e)
#define pr6(a, b, c, d, e, f) pr1(a) << pr5(b, c, d, e, f)
#define pr7(a, b, c, d, e, f, g) pr1(a) << pr6(b, c, d, e, f, g)
#define pr8(a, b, c, d, e, f, g, h) pr1(a) << pr7(b, c, d, e, f, g, h)
#define pr9(a, b, c, d, e, f, g, h, i) pr1(a) << pr8(b, c, d, e, f, g, h, i)
#define pr10(a, b, c, d, e, f, g, h, i, j)                                     \
  pr1(a) << pr9(b, c, d, e, f, g, h, i, j)
#define prArr(a)                                                               \
  {                                                                            \
    CERR << (#a) << "={";                                                      \
    int i = 0;                                                                 \
    for (auto t : (a))                                                         \
      CERR << (i++ ? ", " : "") << t;                                          \
    CERR << "}" << endl;                                                       \
  }
#else
#define DEBUG 0
#define pr(...)
#define prArr(a) {
#endif
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL << 60) + 1e9; // ~ 1.15 * 1e18
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Double, Double>;
template <class T> T Max(T &a, T b) { return a = max(a, b); }
template <class T> T Min(T &a, T b) { return a = min(a, b); }
template <class T1, class T2> ostream &operator<<(ostream &o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream &operator<<(ostream &o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2> istream &operator>>(istream &i, pair<T1, T2> &p) {
  return i >> p.first >> p.second;
}
template <class T> ostream &operator<<(ostream &o, vector<T> a) {
  Int i = 0;
  for (T t : a)
    o << (i++ ? " " : "") << t;
  return o;
}
template <class T> istream &operator>>(istream &i, vector<T> &a) {
  for (T &t : a)
    i >> t;
  return i;
}
// INSERT ABOVE HERE
vector<P> L, R, U, D;

vector<Double> calc(Double t) {
  const Double INF = 1e30;
  Double x = INF, X = -INF, y = INF, Y = -INF;
  for (auto p : L)
    Min(x, p.first - t), Max(X, p.first - t);
  for (auto p : R)
    Min(x, p.first + t), Max(X, p.first + t);
  for (auto p : D)
    Min(y, p.second - t), Max(Y, p.second - t);
  for (auto p : U)
    Min(y, p.second + t), Max(Y, p.second + t);

  for (auto p : L)
    Min(y, p.second), Max(Y, p.second);
  for (auto p : R)
    Min(y, p.second), Max(Y, p.second);
  for (auto p : D)
    Min(x, p.first), Max(X, p.first);
  for (auto p : U)
    Min(x, p.first), Max(X, p.first);
  return {x, X, y, Y};
}

tuple<Double, Double> search(Int idx) {
  const Int f = idx == 0 || idx == 2 ? -1 : 1;
  const Double INF = 5e8;
  const Double EP = 0.1;
  Double a, b;
  {
    Double L = 0, R = INF;
    for (Int i = 0; i < 100; i++) {
      Double M1 = (L + R) / 2;
      Double M2 = (L + R) / 2 + EP;
      Double y1 = f * calc(M1)[idx];
      Double y2 = f * calc(M2)[idx];
      y1 > y2 ? (L = M1) : (R = M1);
    }
    a = L;
  }
  {
    Double L = 0, R = INF;
    for (Int i = 0; i < 100; i++) {
      Double M1 = (L + R) / 2;
      Double M2 = (L + R) / 2 + EP;
      Double y1 = f * calc(M1)[idx];
      Double y2 = f * calc(M2)[idx];
      y1 >= y2 ? (L = M1) : (R = M1);
    }
    b = L;
  }
  return make_tuple(a, b);
}

signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  Int N;
  cin >> N;
  for (Int i = 0; i < N; i++) {
    Int x, y;
    char d;
    cin >> x >> y >> d;
    if (d == 'L')
      L.emplace_back(x, y);
    if (d == 'R')
      R.emplace_back(x, y);
    if (d == 'U')
      U.emplace_back(x, y);
    if (d == 'D')
      D.emplace_back(x, y);
  }

  vector<Double> A;
  for (Int i = 0; i < 4; i++) {
    Double a, b;
    tie(a, b) = search(i);
    A.push_back(a);
    A.push_back(b);
    pr(i, a, b);
  }

  Double ans = INF;
  for (Double t : A) {
    for (Int i = -1000; i < 1000; i++) {
      Double tt = max<Double>(0, Int(t) + i * 0.1);
      auto v = calc(tt);
      Double score = (v[1] - v[0]) * (v[3] - v[2]);
      Min(ans, score);
    }
  }
  cout << ans << endl;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#ifdef LOCAL_DEBUG
#define DEBUG 1
#define CERR                                                                   \
  if (DEBUG)                                                                   \
  cerr
#define MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, NAME, ...) NAME
#define pr(...)                                                                \
  CERR << MACRO(__VA_ARGS__, pr10, pr9, pr8, pr7, pr6, pr5, pr4, pr3, pr2,     \
                pr1)(__VA_ARGS__)                                              \
       << endl
#define pr1(a) (#a) << "=" << (a) << " "
#define pr2(a, b) pr1(a) << pr1(b)
#define pr3(a, b, c) pr1(a) << pr2(b, c)
#define pr4(a, b, c, d) pr1(a) << pr3(b, c, d)
#define pr5(a, b, c, d, e) pr1(a) << pr4(b, c, d, e)
#define pr6(a, b, c, d, e, f) pr1(a) << pr5(b, c, d, e, f)
#define pr7(a, b, c, d, e, f, g) pr1(a) << pr6(b, c, d, e, f, g)
#define pr8(a, b, c, d, e, f, g, h) pr1(a) << pr7(b, c, d, e, f, g, h)
#define pr9(a, b, c, d, e, f, g, h, i) pr1(a) << pr8(b, c, d, e, f, g, h, i)
#define pr10(a, b, c, d, e, f, g, h, i, j)                                     \
  pr1(a) << pr9(b, c, d, e, f, g, h, i, j)
#define prArr(a)                                                               \
  {                                                                            \
    CERR << (#a) << "={";                                                      \
    int i = 0;                                                                 \
    for (auto t : (a))                                                         \
      CERR << (i++ ? ", " : "") << t;                                          \
    CERR << "}" << endl;                                                       \
  }
#else
#define DEBUG 0
#define pr(...)
#define prArr(a) {
#endif
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL << 60) + 1e9; // ~ 1.15 * 1e18
const Int mod = (1e9) + 7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Double, Double>;
template <class T> T Max(T &a, T b) { return a = max(a, b); }
template <class T> T Min(T &a, T b) { return a = min(a, b); }
template <class T1, class T2> ostream &operator<<(ostream &o, pair<T1, T2> p) {
  return o << "(" << p.first << "," << p.second << ")";
}
template <class T1, class T2, class T3>
ostream &operator<<(ostream &o, tuple<T1, T2, T3> t) {
  return o << "(" << get<0>(t) << "," << get<1>(t) << "," << get<2>(t) << ")";
}
template <class T1, class T2> istream &operator>>(istream &i, pair<T1, T2> &p) {
  return i >> p.first >> p.second;
}
template <class T> ostream &operator<<(ostream &o, vector<T> a) {
  Int i = 0;
  for (T t : a)
    o << (i++ ? " " : "") << t;
  return o;
}
template <class T> istream &operator>>(istream &i, vector<T> &a) {
  for (T &t : a)
    i >> t;
  return i;
}
// INSERT ABOVE HERE
vector<P> L, R, U, D;

vector<Double> calc(Double t) {
  const Double INF = 1e30;
  Double x = INF, X = -INF, y = INF, Y = -INF;
  for (auto p : L)
    Min(x, p.first - t), Max(X, p.first - t);
  for (auto p : R)
    Min(x, p.first + t), Max(X, p.first + t);
  for (auto p : D)
    Min(y, p.second - t), Max(Y, p.second - t);
  for (auto p : U)
    Min(y, p.second + t), Max(Y, p.second + t);

  for (auto p : L)
    Min(y, p.second), Max(Y, p.second);
  for (auto p : R)
    Min(y, p.second), Max(Y, p.second);
  for (auto p : D)
    Min(x, p.first), Max(X, p.first);
  for (auto p : U)
    Min(x, p.first), Max(X, p.first);
  return {x, X, y, Y};
}

tuple<Double, Double> search(Int idx) {
  const Int f = idx == 0 || idx == 2 ? -1 : 1;
  const Double INF = 5e8;
  const Double EP = 0.1;
  Double a, b;
  {
    Double L = 0, R = INF;
    for (Int i = 0; i < 100; i++) {
      Double M1 = (L + R) / 2;
      Double M2 = (L + R) / 2 + EP;
      Double y1 = f * calc(M1)[idx];
      Double y2 = f * calc(M2)[idx];
      y1 > y2 ? (L = M1) : (R = M1);
    }
    a = L;
  }
  {
    Double L = 0, R = INF;
    for (Int i = 0; i < 100; i++) {
      Double M1 = (L + R) / 2;
      Double M2 = (L + R) / 2 + EP;
      Double y1 = f * calc(M1)[idx];
      Double y2 = f * calc(M2)[idx];
      y1 >= y2 ? (L = M1) : (R = M1);
    }
    b = L;
  }
  return make_tuple(a, b);
}

signed main() {
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  Int N;
  cin >> N;
  for (Int i = 0; i < N; i++) {
    Int x, y;
    char d;
    cin >> x >> y >> d;
    if (d == 'L')
      L.emplace_back(x, y);
    if (d == 'R')
      R.emplace_back(x, y);
    if (d == 'U')
      U.emplace_back(x, y);
    if (d == 'D')
      D.emplace_back(x, y);
  }

  vector<Double> A;
  for (Int i = 0; i < 4; i++) {
    Double a, b;
    tie(a, b) = search(i);
    A.push_back(a);
    A.push_back(b);
    pr(i, a, b);
  }

  Double ans = INF;
  for (Double t : A) {
    for (Int i = -100; i < 100; i++) {
      Double tt = max<Double>(0, Int(t) + i * 0.1);
      auto v = calc(tt);
      Double score = (v[1] - v[0]) * (v[3] - v[2]);
      Min(ans, score);
    }
  }
  cout << ans << endl;
  return 0;
}