티스토리 뷰
https://www.acmicpc.net/problem/9482
Solution 1 :
원으로 생각하면 골치아프니 (x, y, z)를 중심으로 하는 2k 길이의 정육면체를 생각하고, 여기 안에 있는 점들을 일일히 순회한다.
순회를 할 수 있다고 치면 복잡도는 얼마일까? 답에 도움이 안되는 점들은 정육면체 - 구 영역에 존재할 것이다. 이러한 영역은 8개이며, 8개 영역 각각에 속하는 모든 점들은 서로의 거리가 K 이하이다. 고로 각 영역에 이러한 점들은 많아야 O(sqrt(ans))개. 순회만 할수 있으면 된다.
순회를 하는 건.. z축 기준으로 스위핑을 하며, 스위핑 과정에서 세그트리 + std::set을 사용했다. std::set은 y축 기준 정렬, 세그트리는 x축 기준이고, x축은 이 때문에 약간의 좌표압축을 가해줬다. 뭐.. 딱히 길지는 않다. 순수 스위핑은 O(Nlg^2N)으로 꽤 빠르게 동작한다.
Solution 2 :
[x / K, y / K, z / K] 기준으로 버킷을 만들어 준다.버킷 내부의 원소는 많아야 O(sqrt(ans))개. 점 하나와 거리 K 이하인 점은 인접한 버킷 27개를 봐주면 구할 수 있다. 버킷의 인덱스가 과다하긴 한데 std::map같은 걸로 해결 가능.
solution 1을 보고 solution 2를 확인했다. 이렇게 보니 훨씬 생각하기 쉬운 문제인데 너무 어렵게 생각했다 ㅠㅠ
'공부 > Problem solving' 카테고리의 다른 글
problem solving 2016.03.16 (0) | 2016.03.16 |
---|---|
Sign on Fence (CF 276E) (0) | 2016.03.12 |
Closest pair of points problem (0) | 2016.03.10 |
Codeforces Round #345 (0) | 2016.03.08 |
Jzzhu and Numbers (CF 257D) (0) | 2016.03.04 |
댓글
공지사항
최근에 올라온 글
- Total
- Today
- Yesterday