문제 링크
- https://icpc.me/5383
문제 출처
- 2011 BAPC C번
사용 알고리즘
- Point-Line Duality
- Convex Hull
시간복잡도
- $O((N+M) \log M)$
풀이
$T_l$이 $T_r$보다 왼쪽에 있다는 정보를 $T_l$과 $T_r$을 연결하는 직선으로 생각하면, 각 점이 Half Plane Intersection으로 구한 볼록 다각형 내부에 있는지 판별하는 문제가 됩니다. HPI를 짜는 것은 귀찮으므로 다른 풀이를 생각해 봅시다.
$x(T_l) < x(T_r)$이면 어떤 점 $P$가 정답이 위해서는 $T_l$과 $T_r$을 연결하는 직선 $L_1$보다 아래에 있어야 합니다. 반대로 $x(T_l) > x(T_r)$이면 $P$는 $T_l$과 $T_r$을 연결하는 직선 $L_2$보다 위에 있어야 합니다.
Point-Line Duality를 사용하면 점 $L_1^\ast$는 직선 $P^\ast$보다 아래에 있어야 하고, $L_2$는 $P^\ast$보다 위에 있어야 합니다. 이때 $P(a, b), L: y=ax+b$라고 하면 $P^\ast = ax-b, L^\ast(a, -b)$입니다.
따라서 이 문제는 $L_1^\ast$들의 upper hull보다 위에 있고 $L_2^\ast$들로 만든 lower hull보다 아래에 있는 $P^\ast$를 구하는 문제입니다. 위/아래 껍질은 $O(M \log M)$에 구할 수 있고, 기울기가 주어졌을 때 볼록 다각형의 접점을 $O(\log N)$ 시간에 구할 수 있으므로 전체 문제를 $O((N+M) \log M)$ 정도에 해결할 수 있습니다.
전체 코드
1 |
|