https://www.acmicpc.net/problem/16192
기하학 문제인 것도 모자라 지문이 영어라 보자마자 런친 분들이 꽤 많을 것으로 보입니다. 절대 어려운 문제가 아니니 쫄지 않아도 됩니다.
N개의 점으로 만들어지는 보로노이 다이어그램이 있을 때, Q개의 쿼리로 주어지는 점이 각각 어떤 다이어그램의 영역 안에 있는지, 두 영역이 만나는 경계 위에 있는지, 혹은 3개 이상의 영역이 만나는 경계 위의 점인지 판별하면 됩니다.
쿼리로 주어진 하나의 점과 N개의 모든 점과의 거리를 알고 있다고 합시다.
최단 거리를 갖는 점이 단 하나라면 REGION, 두 개라면 LINE, 3개 이상이라면 POINT를 출력하면 됩니다.
대충 눈치채셨겠으나 NONE인 경우는 존재하지 않습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define holyshit ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define po(x) ((x) * (x))
struct point {
ll x, y;
};
ll dist(const point& p1, const point& p2) { return po(p1.x - p2.x) + po(p1.y - p2.y); }
int voronoi() {
int N, Q; cin >> N >> Q;
vector<point> pts(N);
for (int i = 0; i < N; i++) { cin >> pts[i].x >> pts[i].y; }
for (int i = 0; i < Q; i++) {
vector<int> conv; point p; cin >> p.x >> p.y;
ll mi = 1e18;
for (int j = 0; j < N; j++) {
ll d = dist(p, pts[j]);
if (d < mi) { mi = d; conv.clear(); conv.push_back(j); }
else if (d == mi) { conv.push_back(j); }
}
int cnt = conv.size();
if (cnt == 1) cout << "REGION " << conv[0] + 1 << '\n';
else if (cnt == 2) cout << "LINE " << conv[0] + 1 << " " << conv[1] + 1 << '\n';
else if (cnt >= 3) cout << "POINT" << '\n';
}
return 0;
}
int main() { holyshit; voronoi(); return 0; }
여담으로 빠른 입출력을 사용하지 않으면 말 그대로의 파멸적인 실행 시간을 마주할 수 있습니다.
저같은 경우 692ms가 7808ms가 되는 기적을 경험했습니다.