페이지

9015번: 정사각형

https://www.acmicpc.net/problem/9015


#include<cstdio>
#include<set>
#include<algorithm>
using namespace std;
const int MAX_N = 3e4;
int n, t, x[MAX_N], y[MAX_N];
int main() {
    scanf("%d", &t);
    while (t--) {
        int res = 0;
        set<pair<intint> > st;
        scanf("%d", &n);
        for (int i = 0; i < n; i++) scanf("%d %d", x + i, y + i), st.insert({ x[i],y[i] });
        for (int i = 0; i < n; i++) {
            for (int j = i + 1, p, q, r, s; j < n; j++) {
                p = x[i] + x[j];
                q = y[i] + y[j];
                r = x[i] - x[j];
                s = y[i] - y[j];
                if (abs(p - q) & 1) continue;
                if (st.find({ (p + s) / 2,(q - r) / 2 }) != st.end() && st.find({ (p - s) / 2,(q + r) / 2 }) != st.end())
                    res = max(res, (r*r + s*s) / 2);
            }
        }
        printf("%d\n", res);
    }
    return 0;
}

댓글 2개 :

  1. abs(p - q) & 1 부분은 왜 필요한거죠?

    답글삭제
  2. 격자점을 꼭지점으로 갖는 정사각형은 중심점이 (x,y), (x+0.5,y+0.5) (x,y는 정수)일 수밖에 없습니다.
    소스에서는 (p/2,q/2)이 정사각형의 중심점을 의미하는데 p-q가 홀수인 경우 중심점이 (x,y+0.5), (x+0.5,y) 꼴이므로 제외할 수 있습니다.
    다음 조건문에서 나눗셈 연산을 통해 소수점이 잘려나간 좌표값을 set에서 찾는 것을 방지하려고 미리 제외시켰습니다.

    답글삭제