Problem p03585 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
using lint = long long int;
using pint = pair<int, int>;
using plint = pair<lint, lint>;
struct fast_ios {
  fast_ios() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
#define FOR(i, begin, end)                                                     \
  for (int i = (begin), i##_end_ = (end); i < i##_end_; i++)
#define IFOR(i, begin, end)                                                    \
  for (int i = (end)-1, i##_begin_ = (begin); i >= i##_begin_; i--)
#define REP(i, n) FOR(i, 0, n)
#define IREP(i, n) IFOR(i, 0, n)
template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  for (auto &v : vec)
    is >> v;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, vector<T> &vec) {
  os << "[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, set<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, pair<T1, T2> &pa) {
  os << "(" << pa.first << "," << pa.second << ")";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
#define dbg(x)                                                                 \
  cerr << #x << " = " << (x) << " (L" << __LINE__ << ") " << __FILE__ << endl;

int N;
vector<int> A, B, C;

// 1-indexed BIT (i : [1, len])
template <typename T, int len> struct BIT {
  array<T, len + 1> val;
  BIT() { val.fill(0); }
  void add(int pos, T v) {
    while (pos > 0 && pos <= len) {
      val[pos] += v;
      pos += pos & -pos;
    }
  }
  T sum(int pos) {
    T res = 0;
    while (pos > 0) {
      res += val[pos];
      pos -= pos & -pos;
    }
    return res;
  }
};

int cnt(const vector<double> &vec) {
  vector<double> vec_sorted = vec;
  sort(vec_sorted.begin(), vec_sorted.end());

  map<double, int> ma;
  REP(i, vec_sorted.size()) ma[vec_sorted[i]] = i + 1;

  BIT<int, 40001> bit;
  int ans = 0;
  for (auto v : vec) {
    ans += bit.sum(ma[v]);
    bit.add(ma[v], 1);
  }
  return ans;
}

double solve(const vector<int> &A, const vector<int> &B, const vector<int> &C) {
  using p = pair<double, double>;
  vector<p> info(N);
  REP(i, N) info[i] = p((double)A[i] / B[i], (double)C[i] / B[i]);
  sort(info.begin(), info.end());

  double l = -1E10, r = 1E10;
  while (r - l > 1E-10) {
    double c = (l + r) / 2;
    vector<double> vec(N);
    REP(i, N) vec[i] = info[i].second - info[i].first * c;
    if (cnt(vec) > N * (N - 1) / 2 / 2)
      l = c;
    else
      r = c;
  }
  return l;
}

int main() {
  cin >> N;
  A.resize(N);
  B.resize(N);
  C.resize(N);
  REP(i, N) cin >> A[i] >> B[i] >> C[i];

  cout << solve(A, B, C) << " " << solve(B, A, C) << endl;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
using lint = long long int;
using pint = pair<int, int>;
using plint = pair<lint, lint>;
struct fast_ios {
  fast_ios() {
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(20);
  };
} fast_ios_;
#define FOR(i, begin, end)                                                     \
  for (int i = (begin), i##_end_ = (end); i < i##_end_; i++)
#define IFOR(i, begin, end)                                                    \
  for (int i = (end)-1, i##_begin_ = (begin); i >= i##_begin_; i--)
#define REP(i, n) FOR(i, 0, n)
#define IREP(i, n) IFOR(i, 0, n)
template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  for (auto &v : vec)
    is >> v;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, vector<T> &vec) {
  os << "[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T> ostream &operator<<(ostream &os, set<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T1, typename T2>
ostream &operator<<(ostream &os, pair<T1, T2> &pa) {
  os << "(" << pa.first << "," << pa.second << ")";
  return os;
}
template <typename TK, typename TV>
ostream &operator<<(ostream &os, map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
#define dbg(x)                                                                 \
  cerr << #x << " = " << (x) << " (L" << __LINE__ << ") " << __FILE__ << endl;

int N;
vector<int> A, B, C;

// 1-indexed BIT (i : [1, len])
template <typename T, int len> struct BIT {
  array<T, len + 1> val;
  BIT() { val.fill(0); }
  void add(int pos, T v) {
    while (pos > 0 && pos <= len) {
      val[pos] += v;
      pos += pos & -pos;
    }
  }
  T sum(int pos) {
    T res = 0;
    while (pos > 0) {
      res += val[pos];
      pos -= pos & -pos;
    }
    return res;
  }
};

int cnt(const vector<double> &vec) {
  vector<double> vec_sorted = vec;
  sort(vec_sorted.begin(), vec_sorted.end());

  map<double, int> ma;
  REP(i, vec_sorted.size()) ma[vec_sorted[i]] = i + 1;

  BIT<int, 40001> bit;
  int ans = 0;
  for (auto v : vec) {
    ans += bit.sum(ma[v]);
    bit.add(ma[v], 1);
  }
  return ans;
}

double solve(const vector<int> &A, const vector<int> &B, const vector<int> &C) {
  using p = pair<double, double>;
  vector<p> info(N);
  REP(i, N) info[i] = p((double)A[i] / B[i], (double)C[i] / B[i]);
  sort(info.begin(), info.end());

  double l = -1E10, r = 1E10;
  while (r - l > 1E-10 and (r - l) > (abs(l) + abs(r)) * 1E-10) {
    double c = (l + r) / 2;
    vector<double> vec(N);
    REP(i, N) vec[i] = info[i].second - info[i].first * c;
    if (cnt(vec) > N * (N - 1) / 2 / 2)
      l = c;
    else
      r = c;
  }
  return l;
}

int main() {
  cin >> N;
  A.resize(N);
  B.resize(N);
  C.resize(N);
  REP(i, N) cin >> A[i] >> B[i] >> C[i];

  cout << solve(A, B, C) << " " << solve(B, A, C) << endl;
}