Problem p02926 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i >= 0; i--)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define FORR(i, m, n) for (int i = m; i >= n; i--)
#define SORT(v, n) sort(v, v + n);
#define VSORT(v) sort(v.begin(), v.end());
#define VRSORT(v) sort(v.begin(), v.end(), greater<long long>());
#define ALL(X) (X).begin(), (X).end()
#define INF 99999999
#define M_PI 3.14159265358979323846
#define MOD 1000000007

#ifdef __LOCAL
#define DBG(X) cout << #X << " = " << (X) << endl;
#define SAY(X) cout << (X) << endl;
#else
#define DBG(X)
#define SAY(X)
#endif

#ifdef __LOCAL
#include <filesystem>
namespace fs = std::filesystem;
#endif

using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

int dx[] = {1, 0, -1, 0, 0};
int dy[] = {0, 1, 0, -1, 0};
const int INT_INF = (int)(2e9);
const ll LL_INF = (ll)(2e18);
const int NIL = -1;
static mt19937 _g(time(nullptr));

std::string pad(int num) {
  char buffer[4];
  std::snprintf(buffer, sizeof(buffer), "%03d", num);
  return buffer;
}
inline ll randint(ll a, ll b) {
  ll w = (_g() << 31LL) ^ _g();
  return a + w % (b - a + 1);
}
inline void fast_io() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
};
template <typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template <typename T, typename S>
inline ostream &operator<<(ostream &os, const pair<T, S> p) {
  cout << "[" << p.first << ";" << p.second << "]";
  return os;
}
template <typename T, typename S>
inline ostream &operator<<(ostream &os, const map<T, S> p) {
  for (auto el : p)
    os << "[" << el.first << " " << el.second << "]";
  return os;
}
template <typename T>
inline ostream &operator<<(ostream &os, const vector<T> &v) {
  for (auto el : v)
    os << el << " ";
  return os;
}
template <typename T> inline T fetch() {
  T ret;
  cin >> ret;
  return ret;
}
template <typename T> inline vector<T> fetch_vec(int sz) {
  vector<T> ret(sz);
  for (auto &elem : ret)
    cin >> elem;
  return ret;
}

struct point {
  double x, y;
  complex<double> z;
  double theta;
  point(double x = 0, double y = 0) : x(x), y(y) {
    complex<double> w(x, y);
    z = w;
    calc_theta();
  }
  void calc_theta() { theta = arg(z); }
  double dist() { return sqrt(x * x + y * y); }
  double dist2() { return (x * x + y * y); }
  point operator+=(const point &a) {
    x += a.x;
    y += a.y;
    return *this;
  }
};

int N;
vector<point> X;

void input() {
  fast_io();
#ifdef __LOCAL
  fs::path p = __FILE__;
  fs::path input, output;
  input = output = p.parent_path();
  input += string("/input/") + string(p.stem()) + string(".txt");
  output += string("/output/") + string(p.stem()) + string(".txt");
  freopen(input.c_str(), "r", stdin);
  freopen(output.c_str(), "w", stdout);
#endif
  cin >> N;
  for (int i = 0; i < N; i++) {
    int x, y;
    cin >> x >> y;
    X.emplace_back(x, y);
  }
}

double diff_theta(double a, double b) {
  if (a * b >= 0)
    return abs(a - b);
  else {
    if (b < 0)
      swap(a, b);
    return min(b - a, 2 * M_PI - b + a);
  }
}
double eps = 1e-9;
void solve() {
  double ans = 0;
  auto cmp = [&](point a, point b) { return a.theta < b.theta; };
  sort(X.begin(), X.end(), cmp);
  for (int i = 0; i < N; i++) {
    point z;
    for (int j = i; j < N; j++) {
      if (diff_theta(X[i].theta, X[j].theta) < M_PI) {
        z += X[j];
        if (j == N - 1)
          j = 0;
      } else
        break;
    }
    ans = max(ans, z.dist2());
  }

  // for (int i = -180000; i <= 180000; i++)
  // {
  //     double arg = (double)i/360000*M_PI;
  //     point po;
  //     for(auto p:X) {

  //         if(diff_theta(arg,p.theta)<M_PI_2-eps) {po+=p;}
  //         }
  //     ans = max(ans,po.dist2());
  // }
  cout << setprecision(12) << sqrt(ans) << endl;
}

int main() {
  input();
  solve();
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i >= 0; i--)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define FORR(i, m, n) for (int i = m; i >= n; i--)
#define SORT(v, n) sort(v, v + n);
#define VSORT(v) sort(v.begin(), v.end());
#define VRSORT(v) sort(v.begin(), v.end(), greater<long long>());
#define ALL(X) (X).begin(), (X).end()
#define INF 99999999
#define M_PI 3.14159265358979323846
#define MOD 1000000007

#ifdef __LOCAL
#define DBG(X) cout << #X << " = " << (X) << endl;
#define SAY(X) cout << (X) << endl;
#else
#define DBG(X)
#define SAY(X)
#endif

#ifdef __LOCAL
#include <filesystem>
namespace fs = std::filesystem;
#endif

using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

int dx[] = {1, 0, -1, 0, 0};
int dy[] = {0, 1, 0, -1, 0};
const int INT_INF = (int)(2e9);
const ll LL_INF = (ll)(2e18);
const int NIL = -1;
static mt19937 _g(time(nullptr));

std::string pad(int num) {
  char buffer[4];
  std::snprintf(buffer, sizeof(buffer), "%03d", num);
  return buffer;
}
inline ll randint(ll a, ll b) {
  ll w = (_g() << 31LL) ^ _g();
  return a + w % (b - a + 1);
}
inline void fast_io() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
};
template <typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template <typename T, typename S>
inline ostream &operator<<(ostream &os, const pair<T, S> p) {
  cout << "[" << p.first << ";" << p.second << "]";
  return os;
}
template <typename T, typename S>
inline ostream &operator<<(ostream &os, const map<T, S> p) {
  for (auto el : p)
    os << "[" << el.first << " " << el.second << "]";
  return os;
}
template <typename T>
inline ostream &operator<<(ostream &os, const vector<T> &v) {
  for (auto el : v)
    os << el << " ";
  return os;
}
template <typename T> inline T fetch() {
  T ret;
  cin >> ret;
  return ret;
}
template <typename T> inline vector<T> fetch_vec(int sz) {
  vector<T> ret(sz);
  for (auto &elem : ret)
    cin >> elem;
  return ret;
}

struct point {
  double x, y;
  complex<double> z;
  double theta;
  point(double x = 0, double y = 0) : x(x), y(y) {
    complex<double> w(x, y);
    z = w;
    calc_theta();
  }
  void calc_theta() { theta = arg(z); }
  double dist() { return sqrt(x * x + y * y); }
  double dist2() { return (x * x + y * y); }
  point operator+=(const point &a) {
    x += a.x;
    y += a.y;
    return *this;
  }
};

int N;
vector<point> X;

void input() {
  fast_io();
#ifdef __LOCAL
  fs::path p = __FILE__;
  fs::path input, output;
  input = output = p.parent_path();
  input += string("/input/") + string(p.stem()) + string(".txt");
  output += string("/output/") + string(p.stem()) + string(".txt");
  freopen(input.c_str(), "r", stdin);
  freopen(output.c_str(), "w", stdout);
#endif
  cin >> N;
  for (int i = 0; i < N; i++) {
    int x, y;
    cin >> x >> y;
    X.emplace_back(x, y);
  }
}

double diff_theta(double a, double b) {
  if (a * b >= 0)
    return abs(a - b);
  else {
    if (b < 0)
      swap(a, b);
    return min(b - a, 2 * M_PI - b + a);
  }
}
double eps = 1e-9;
void solve() {
  double ans = 0;
  auto cmp = [&](point a, point b) { return a.theta < b.theta; };
  sort(X.begin(), X.end(), cmp);
  for (int i = 0; i < N; i++) {
    point z;
    for (int j = i; j < 2 * N; j++) {
      point tmp = z;
      tmp += X[j % N];
      if (tmp.dist2() >= z.dist2())
        z = tmp;
      else
        break;
      if (j == (N + i - 1))
        break;
    }
    ans = max(ans, z.dist2());
  }

  // for (int i = -180000; i <= 180000; i++)
  // {
  //     double arg = (double)i/360000*M_PI;
  //     point po;
  //     for(auto p:X) {

  //         if(diff_theta(arg,p.theta)<M_PI_2-eps) {po+=p;}
  //         }
  //     ans = max(ans,po.dist2());
  // }
  cout << setprecision(12) << sqrt(ans) << endl;
}

int main() {
  input();
  solve();
  return 0;
}