Problem p03585 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <iterator>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define FORR(it, cont) for (auto it = rbegin(cont); it != rend(cont); ++it)
#define FOR(it, cont) for (auto it = begin(cont); it != end(cont); ++it)
#define ALL(cont) begin(cont), end(cont)
#define LB(b, e, v) lower_bound(b, e, v)
#define UB(b, e, v) upper_bound(b, e, v)
#define AS_MOD(a, b) ((((a) % (b)) + (b)) % (b))
#define MODDING(a, b) (a) = AS_MOD(a, b)
#define MAXIMIZE(a, b) (a) = max((a), (b))
#define MINIMIZE(a, b) (a) = min((a), (b))

using namespace std;
typedef pair<double, int> P;
typedef long long ll;
struct Line {
  double a, b, c;
  int order;
  int operator<(const Line &l) const { return 1; }
};
typedef pair<double, Line> PL;
struct FenwickTree {
  static const int MAX_N = 50000;
  ll storage[MAX_N + 1];
  int N;
  void init(int n) {
    N = n;
    for (int i = 0; i < MAX_N; ++i) {
      storage[i] = 0;
    }
  }
  ll sum(int i) { // 0<i<=N
    if (i == 0)
      return 0;
    int ret = 0;
    while (i > 0) {
      ret += storage[i];
      i -= i & -i;
    }
    return ret;
  }
  void add(int i, ll x) { // 0<=i<N
    ++i;
    while (i <= N) {
      storage[i] += x;
      i += i & -i;
    }
  }
  ll rangeSum(int l, int r) { return sum(r) - sum(l); }
};

ll N;
FenwickTree ft;
PL pls[4 * 10000 + 10];
P angles[4 * 10000 + 10];
bool isOK(double d) {
  ft.init(N + 10);
  for (int i = 0; i < N; ++i) {
    double val = (pls[i].second.c - pls[i].second.a * d) / pls[i].second.b;
    angles[i] = P(val, i);
  }
  sort(angles, angles + N);
  for (int i = 0; i < N; ++i) {
    pls[angles[i].second].second.order = i;
  }
  ll numLine = 0;
  for (int i = 0; i < N; ++i) {
    numLine += ft.rangeSum(0, pls[i].second.order + 1);
    ft.add(pls[i].second.order, 1);
  }
  return numLine >= (N * (N - 1) / 2 + 2) / 2;
}
double INF = 1.0 * 1000 * 1000 * 1000;
double EPS = 0.000000001;
double solve() {
  for (int i = 0; i < N; ++i) {
    pls[i].first = pls[i].second.a / pls[i].second.b;
  }
  sort(pls, pls + N);
  double l = -INF, r = INF;
  while (fabs(r - l) > EPS) {
    double m = (r + l) / 2;
    if (isOK(m)) {
      l = m;
    } else {
      r = m;
    }
  }
  return l;
}
int main() {
  cin >> N;
  REP(i, N) {
    int A, B, C;
    scanf("%d%d%d", &A, &B, &C);
    pls[i] = PL(0.0, {1.0 * A, 1.0 * B, 1.0 * C, 0});
  }

  double x = solve();
  for (int i = 0; i < N; ++i) {
    double temp = pls[i].second.a;
    pls[i].second.a = pls[i].second.b;
    pls[i].second.b = temp;
  }
  double y = solve();
  printf("%.15lf %.15lf\n", x, y);
  return 0;
}


Fixed submission:
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <iterator>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#define REP(i, n) for (int i = 0; i < (n); ++i)
#define FORR(it, cont) for (auto it = rbegin(cont); it != rend(cont); ++it)
#define FOR(it, cont) for (auto it = begin(cont); it != end(cont); ++it)
#define ALL(cont) begin(cont), end(cont)
#define LB(b, e, v) lower_bound(b, e, v)
#define UB(b, e, v) upper_bound(b, e, v)
#define AS_MOD(a, b) ((((a) % (b)) + (b)) % (b))
#define MODDING(a, b) (a) = AS_MOD(a, b)
#define MAXIMIZE(a, b) (a) = max((a), (b))
#define MINIMIZE(a, b) (a) = min((a), (b))

using namespace std;
typedef pair<double, int> P;
typedef long long ll;
struct Line {
  double a, b, c;
  int order;
  int operator<(const Line &l) const { return 1; }
};
typedef pair<double, Line> PL;
struct FenwickTree {
  static const int MAX_N = 50000;
  ll storage[MAX_N + 1];
  int N;
  void init(int n) {
    N = n;
    for (int i = 0; i < MAX_N; ++i) {
      storage[i] = 0;
    }
  }
  ll sum(int i) { // 0<i<=N
    if (i == 0)
      return 0;
    int ret = 0;
    while (i > 0) {
      ret += storage[i];
      i -= i & -i;
    }
    return ret;
  }
  void add(int i, ll x) { // 0<=i<N
    ++i;
    while (i <= N) {
      storage[i] += x;
      i += i & -i;
    }
  }
  ll rangeSum(int l, int r) { return sum(r) - sum(l); }
};

ll N;
FenwickTree ft;
PL pls[4 * 10000 + 10];
P angles[4 * 10000 + 10];
bool isOK(double d) {
  ft.init(N + 10);
  for (int i = 0; i < N; ++i) {
    double val = (pls[i].second.c - pls[i].second.a * d) / pls[i].second.b;
    angles[i] = P(val, i);
  }
  sort(angles, angles + N);
  for (int i = 0; i < N; ++i) {
    pls[angles[i].second].second.order = i;
  }
  ll numLine = 0;
  for (int i = 0; i < N; ++i) {
    numLine += ft.rangeSum(0, pls[i].second.order + 1);
    ft.add(pls[i].second.order, 1);
  }
  return numLine >= (N * (N - 1) / 2 + 2) / 2;
}
double INF = 1.0 * 1000 * 1000 * 1000;
double EPS = 0.000000001;
double solve() {
  for (int i = 0; i < N; ++i) {
    pls[i].first = pls[i].second.a / pls[i].second.b;
  }
  sort(pls, pls + N);
  double l = -INF, r = INF;
  for (int i = 0; i <= 70; ++i) {
    double m = (r + l) / 2;
    if (isOK(m)) {
      l = m;
    } else {
      r = m;
    }
  }
  return l;
}
int main() {
  cin >> N;
  REP(i, N) {
    int A, B, C;
    scanf("%d%d%d", &A, &B, &C);
    pls[i] = PL(0.0, {1.0 * A, 1.0 * B, 1.0 * C, 0});
  }

  double x = solve();
  for (int i = 0; i < N; ++i) {
    double temp = pls[i].second.a;
    pls[i].second.a = pls[i].second.b;
    pls[i].second.b = temp;
  }
  double y = solve();
  printf("%.15lf %.15lf\n", x, y);
  return 0;
}