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

#include <algorithm>
#include <bitset>
#include <cctype>
#include <complex>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <limits.h>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string>
#include <vector>

#define VARIABLE(x) cerr << #x << "=" << x << endl
#define BINARY(x) static_cast<bitset<16>>(x)
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define REP(i, m, n) for (int i = m; i < (int)(n); i++)
#define if_range(x, y, w, h)                                                   \\
  if (0 <= (int)(x) && (int)(x) < (int)(w) && 0 <= (int)(y) &&                 \\
      (int)(y) < (int)(h))
#define ALL(a) (a).begin(), (a).end()
const int INF = 1e9;
int dx[4] = {0, 1, 0, -1}, dy[4] = {-1, 0, 1, 0};
using namespace std;
typedef long long ll;
// typedef pair<int, int> P;

/* struct P {
        int x, y, n;
        P(int n, int x, int y):n(n), x(x), y(y){}
        P(){}
}; */

/** 幾何ライブラリ **/
#include <complex>

#define X real()
#define Y imag()

const double EPS = 1e-11;
const double PI = acos(-1.0);

typedef double D;
typedef complex<D> P; // Point

struct L { // Line
  P a, b;
  L() {}
  L(P aa, P bb) : a(aa), b(bb) {}
};

struct C { // Circle
  P p;
  D r;
  C() {}
  C(P pp, D rr) : p(pp), r(rr) {}
};

// 共役複素数 conj(a);

// 符号
int sig(D a, D b = 0) {
  if (a < b - EPS)
    return -1;
  if (a > b + EPS)
    return 1;
  return 0;
}

// 内積
D dot(P a, P b) { return (conj(a) * b).real(); }

// 外積
D cross(P a, P b) { return (conj(a) * b).imag(); }

// 線分abに対する点cの位置
enum STATE {
  LEFT = 1,
  RIGHT = -1,
  BACK = 2,
  FRONT = -2,
  ON = 0,
  IN = 3,
  OUT = -3
};
int ccw(P a, P b, P c) {
  b -= a, c -= a;
  D s = sig(cross(b, c));
  if (s)
    return s > 0 ? LEFT : RIGHT;
  if (sig(dot(b, c)) < 0)
    return BACK;
  if (sig(abs(c), abs(b)) > 0)
    return FRONT;
  return ON;
}

// 直線lに対する点pの写像
P projection(L l, P p) {
  return l.a + (l.b - l.a) / abs(l.b - l.a) * dot(l.b - l.a, p - l.a) /
                   abs(l.b - l.a);
}

// 直線lに対する点pの反射
P reflection(L l, P p) { return p + (projection(l, p) - p) * P(2, 0); }

// 直線abと点cの距離
D dLP(L l, P c) { return abs(cross(l.b - l.a, c - l.a)) / abs(l.b - l.a); }

// 線分abと点cの距離
D dSP(L l, P c) {
  if (sig(dot(l.b - l.a, c - l.a)) < 0)
    return abs(c - l.a);
  if (sig(dot(l.a - l.b, c - l.b)) < 0)
    return abs(c - l.b);
  return abs(cross(l.b - l.a, c - l.a)) / abs(l.b - l.a);
}

// 線分と線分の交差判定
bool iSS(L s, L t) {
  return (ccw(s.a, s.b, t.a) * ccw(s.a, s.b, t.b) <= 0) &&
         (ccw(t.a, t.b, s.a) * ccw(t.a, t.b, s.b) <= 0);
}

// 線分と線分の距離
D dSS(L s, L t) {
  if (iSS(s, t))
    return 0;
  return min(min(dSP(t, s.a), dSP(t, s.b)), min(dSP(s, t.a), dSP(s, t.b)));
}

// 線分と線分の交点 (公差していることが前提)
P cSS(L s, L t) {
  D d1 = dLP(t, s.a);
  D d2 = dLP(t, s.b);
  D tmp = d1 / (d1 + d2);
  return s.a + (s.b - s.a) * tmp;
}

// 直線と直線の交差判定
bool iLL(L s, L t) { return sig(cross(s.b - s.a, t.b - t.a)) != 0; }

// 直線と直線の交点 iLLを確認してから使用
P cLL(L s, L t) {
  P ss = s.b - s.a, tt = t.b - t.a;
  return s.a + ss * cross(tt, t.a - s.a) / cross(tt, ss);
}

// 円と直線の交差判定 (交点の数を返す)
int iCL(C c, L l) {
  int t = sig(dLP(l, c.p), c.r);
  if (t < 0)
    return 2;
  else if (t == 0)
    return 1;
  return 0;
}

// 円と直線の交点を求める
vector<P> cCL(C c, L l) {
  vector<P> res;
  int n = iCL(c, l);

  P h = projection(l, c.p);
  D d = abs(h - c.p);

  if (n == 2) {
    P x = (l.b - l.a) / abs(l.b - l.a) * sqrt(c.r * c.r - d * d);
    res.push_back(h + x);
    res.push_back(h - x);
  } else if (n == 1) {
    res.push_back(h);
  }

  return res;
}

// 円と円の交点を求める (交点があることが前提)
vector<P> cCC(C a, C b) {
  D d = abs(b.p - a.p);
  D rc = (d * d + a.r * a.r - b.r * b.r) / (2 * d);
  D rs = sqrt(a.r * a.r - rc * rc);
  P diff = (b.p - a.p) / d;

  vector<P> res;
  res.push_back(a.p + diff * P(rc, rs));
  res.push_back(a.p + diff * P(rc, -rs));
  return res;
}

// 多角形
typedef vector<P> G;

// 面積を求める
D area(G g) {
  D res = 0.0;
  for (int i = 0; i < g.size(); i++) {
    res += cross(g[i], g[(i + 1) % g.size()]);
  }
  return abs(res) / 2;
}

// 多角形gと点pの包含関係を求める
int containsGP(G g, P p) {
  bool in = false;
  for (int i = 0; i < g.size(); i++) {
    P a = g[i], b = g[(i + 1) % g.size()];
    if (ccw(a, b, p) == ON)
      return ON;

    a -= p, b -= p;
    if (a.Y > b.Y)
      swap(a, b);
    if (a.Y < 0 && b.Y >= 0 && sig(cross(a, b)) > 0)
      in = !in;
  }
  return in ? IN : OUT;
}

bool cmp_convex_full(const P &a, const P &b) {
  if (sig(a.X, b.X) != 0)
    return a.X < b.X;
  return a.Y < b.Y;
}

// 凸包を得る
// 辺上を含めない場合は <= 0 にする
G convex_hull(vector<P> ps) {
  if (ps.size() == 1)
    return ps;

  int N = (int)ps.size(), k = 0;
  sort(ps.begin(), ps.end(), cmp_convex_full);
  G res(2 * N);

  for (int i = 0; i < N; i++) {
    while (k >= 2 && ccw(res[k - 2], res[k - 1], ps[i]) == RIGHT)
      k--;
    res[k++] = ps[i];
  }

  int t = k + 1;
  for (int i = N - 2; i >= 0; i--) {
    while (k >= t && ccw(res[k - 2], res[k - 1], ps[i]) == RIGHT)
      k--;
    res[k++] = ps[i];
  }
  res.resize(k - 1);
  return res;
}

// 凸多角形を直線で切断し、左側を残す
G convex_cut(G g, L l) {
  G res;
  for (int i = 0; i < g.size(); i++) {
    P a = g[i], b = g[(i + 1) % g.size()];
    if (ccw(l.a, l.b, a) != RIGHT)
      res.push_back(a);
    if (ccw(l.a, l.b, a) * ccw(l.a, l.b, b) < 0)
      res.push_back(cLL(L(a, b), l));
  }
  return res;
}

/** Problem0518 : The Oldest Site **/
typedef vector<P> PS;
bool ex[5001][5001];

bool check(P p1, P p2) {
  if (p1.X < 0 || p2.X < 0 || p1.Y < 0 || p2.Y < 0)
    return false;
  if (p1.X > 5000 || p2.X > 5000 || p1.Y > 5000 || p2.Y > 5000)
    return false;
  return ex[(int)p1.X][(int)p1.Y] && ex[(int)p2.X][(int)p2.Y];
}

int main() {
  int N;
  while (cin >> N, N) {
    PS ps;
    fill(ex[0], ex[0] + 5001 * 5001, false);

    rep(i, N) {
      int r, im;
      cin >> r >> im;
      ps.push_back(P(r, im));
      ex[r][im] = true;
    }

    D ans = 0.0;
    for (int i = 0; i < N; i++) {
      for (int j = i + 1; j < N; j++) {
        P p = ps[j] - ps[i];
        D len = abs(p);
        P v = p * P(0, 1);

        P p1 = ps[i] + v, p2 = ps[j] + v;
        if (check(p1, p2))
          ans = max(len * len, ans);

        p1 = ps[i] - v, p2 = ps[j] - v;
        if (check(p1, p2))
          ans = max(len * len, ans);
      }
    }

    cout << (int)round(ans) << endl;
  }
}

Error: 0

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cctype>
#include <complex>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <limits.h>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string>
#include <vector>

#define VARIABLE(x) cerr << #x << "=" << x << endl
#define BINARY(x) static_cast<bitset<16>>(x)
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define REP(i, m, n) for (int i = m; i < (int)(n); i++)
#define if_range(x, y, w, h)                                                   \\
  if (0 <= (int)(x) && (int)(x) < (int)(w) && 0 <= (int)(y) &&                 \\
      (int)(y) < (int)(h))
#define ALL(a) (a).begin(), (a).end()
const int INF = 1e9;
int dx[4] = {0, 1, 0, -1}, dy[4] = {-1, 0, 1, 0};
using namespace std;
typedef long long ll;
// typedef pair<int, int> P;

/* struct P {
        int x, y, n;
        P(int n, int x, int y):n(n), x(x), y(y){}
        P(){}
}; */

/** 幾何ライブラリ **/
#include <complex>

#define X real()
#define Y imag()

const double EPS = 1e-11;
const double PI = acos(-1.0);

typedef double D;
typedef complex<D> P; // Point

struct L { // Line
  P a, b;
  L() {}
  L(P aa, P bb) : a(aa), b(bb) {}
};

struct C { // Circle
  P p;
  D r;
  C() {}
  C(P pp, D rr) : p(pp), r(rr) {}
};

// 共役複素数 conj(a);

// 符号
int sig(D a, D b = 0) {
  if (a < b - EPS)
    return -1;
  if (a > b + EPS)
    return 1;
  return 0;
}

// 内積
D dot(P a, P b) { return (conj(a) * b).real(); }

// 外積
D cross(P a, P b) { return (conj(a) * b).imag(); }

// 線分abに対する点cの位置
enum STATE {
  LEFT = 1,
  RIGHT = -1,
  BACK = 2,
  FRONT = -2,
  ON = 0,
  IN = 3,
  OUT = -3
};
int ccw(P a, P b, P c) {
  b -= a, c -= a;
  D s = sig(cross(b, c));
  if (s)
    return s > 0 ? LEFT : RIGHT;
  if (sig(dot(b, c)) < 0)
    return BACK;
  if (sig(abs(c), abs(b)) > 0)
    return FRONT;
  return ON;
}

// 直線lに対する点pの写像
P projection(L l, P p) {
  return l.a + (l.b - l.a) / abs(l.b - l.a) * dot(l.b - l.a, p - l.a) /
                   abs(l.b - l.a);
}

// 直線lに対する点pの反射
P reflection(L l, P p) { return p + (projection(l, p) - p) * P(2, 0); }

// 直線abと点cの距離
D dLP(L l, P c) { return abs(cross(l.b - l.a, c - l.a)) / abs(l.b - l.a); }

// 線分abと点cの距離
D dSP(L l, P c) {
  if (sig(dot(l.b - l.a, c - l.a)) < 0)
    return abs(c - l.a);
  if (sig(dot(l.a - l.b, c - l.b)) < 0)
    return abs(c - l.b);
  return abs(cross(l.b - l.a, c - l.a)) / abs(l.b - l.a);
}

// 線分と線分の交差判定
bool iSS(L s, L t) {
  return (ccw(s.a, s.b, t.a) * ccw(s.a, s.b, t.b) <= 0) &&
         (ccw(t.a, t.b, s.a) * ccw(t.a, t.b, s.b) <= 0);
}

// 線分と線分の距離
D dSS(L s, L t) {
  if (iSS(s, t))
    return 0;
  return min(min(dSP(t, s.a), dSP(t, s.b)), min(dSP(s, t.a), dSP(s, t.b)));
}

// 線分と線分の交点 (公差していることが前提)
P cSS(L s, L t) {
  D d1 = dLP(t, s.a);
  D d2 = dLP(t, s.b);
  D tmp = d1 / (d1 + d2);
  return s.a + (s.b - s.a) * tmp;
}

// 直線と直線の交差判定
bool iLL(L s, L t) { return sig(cross(s.b - s.a, t.b - t.a)) != 0; }

// 直線と直線の交点 iLLを確認してから使用
P cLL(L s, L t) {
  P ss = s.b - s.a, tt = t.b - t.a;
  return s.a + ss * cross(tt, t.a - s.a) / cross(tt, ss);
}

// 円と直線の交差判定 (交点の数を返す)
int iCL(C c, L l) {
  int t = sig(dLP(l, c.p), c.r);
  if (t < 0)
    return 2;
  else if (t == 0)
    return 1;
  return 0;
}

// 円と直線の交点を求める
vector<P> cCL(C c, L l) {
  vector<P> res;
  int n = iCL(c, l);

  P h = projection(l, c.p);
  D d = abs(h - c.p);

  if (n == 2) {
    P x = (l.b - l.a) / abs(l.b - l.a) * sqrt(c.r * c.r - d * d);
    res.push_back(h + x);
    res.push_back(h - x);
  } else if (n == 1) {
    res.push_back(h);
  }

  return res;
}

// 円と円の交点を求める (交点があることが前提)
vector<P> cCC(C a, C b) {
  D d = abs(b.p - a.p);
  D rc = (d * d + a.r * a.r - b.r * b.r) / (2 * d);
  D rs = sqrt(a.r * a.r - rc * rc);
  P diff = (b.p - a.p) / d;

  vector<P> res;
  res.push_back(a.p + diff * P(rc, rs));
  res.push_back(a.p + diff * P(rc, -rs));
  return res;
}

// 多角形
typedef vector<P> G;

// 面積を求める
D area(G g) {
  D res = 0.0;
  for (int i = 0; i < g.size(); i++) {
    res += cross(g[i], g[(i + 1) % g.size()]);
  }
  return abs(res) / 2;
}

// 多角形gと点pの包含関係を求める
int containsGP(G g, P p) {
  bool in = false;
  for (int i = 0; i < g.size(); i++) {
    P a = g[i], b = g[(i + 1) % g.size()];
    if (ccw(a, b, p) == ON)
      return ON;

    a -= p, b -= p;
    if (a.Y > b.Y)
      swap(a, b);
    if (a.Y < 0 && b.Y >= 0 && sig(cross(a, b)) > 0)
      in = !in;
  }
  return in ? IN : OUT;
}

bool cmp_convex_full(const P &a, const P &b) {
  if (sig(a.X, b.X) != 0)
    return a.X < b.X;
  return a.Y < b.Y;
}

// 凸包を得る
// 辺上を含めない場合は <= 0 にする
G convex_hull(vector<P> ps) {
  if (ps.size() == 1)
    return ps;

  int N = (int)ps.size(), k = 0;
  sort(ps.begin(), ps.end(), cmp_convex_full);
  G res(2 * N);

  for (int i = 0; i < N; i++) {
    while (k >= 2 && ccw(res[k - 2], res[k - 1], ps[i]) == RIGHT)
      k--;
    res[k++] = ps[i];
  }

  int t = k + 1;
  for (int i = N - 2; i >= 0; i--) {
    while (k >= t && ccw(res[k - 2], res[k - 1], ps[i]) == RIGHT)
      k--;
    res[k++] = ps[i];
  }
  res.resize(k - 1);
  return res;
}

// 凸多角形を直線で切断し、左側を残す
G convex_cut(G g, L l) {
  G res;
  for (int i = 0; i < g.size(); i++) {
    P a = g[i], b = g[(i + 1) % g.size()];
    if (ccw(l.a, l.b, a) != RIGHT)
      res.push_back(a);
    if (ccw(l.a, l.b, a) * ccw(l.a, l.b, b) < 0)
      res.push_back(cLL(L(a, b), l));
  }
  return res;
}

/** Problem0518 : The Oldest Site **/
typedef vector<P> PS;
bool ex[5001][5001];

bool check(P p1, P p2) {
  if (p1.X < 0 || p2.X < 0 || p1.Y < 0 || p2.Y < 0)
    return false;
  return ex[(int)p1.X][(int)p1.Y] && ex[(int)p2.X][(int)p2.Y];
}

int main() {
  int N;
  while (cin >> N, N) {
    PS ps;

    rep(i, N) {
      int r, im;
      cin >> r >> im;
      ps.push_back(P(r, im));
      ex[r][im] = true;
    }

    D ans = 0.0;
    for (int i = 0; i < N; i++) {
      for (int j = i + 1; j < N; j++) {
        P p = ps[j] - ps[i];
        D len = abs(p);
        P v = p * P(0, 1);

        P p1 = ps[i] + v, p2 = ps[j] + v;
        if (check(p1, p2))
          ans = max(len * len, ans);

        p1 = ps[i] - v, p2 = ps[j] - v;
        if (check(p1, p2))
          ans = max(len * len, ans);
      }
    }

    cout << ans << endl;
  }
}