문제 링크
- https://icpc.me/20445
사용 알고리즘
- 플로이드
시간복잡도
- $O(N^3 + Q)$
풀이
수직선 상의 구간 $[a, b]$를 덮는 것을 $s$번 정점에서 $b$번 정점으로 가는 것이라고 생각해 봅시다. $[s, e]$를 하나의 구간으로 덮는 것은, $s \leq i \leq j \leq e$인 모든 $i, j$에 대해 $i$에서 $j$로 가는 지름길이라고 생각할 수 있습니다.
입력으로는 $[-10^9, 10^9]$까지 주어질 수 있지만, 좌표 압축을 하면 정점의 개수를 $2N$개 이하로 줄일 수 있습니다.
간선은 구간마다 $O(N^2)$개씩 만들어서 총 $O(N^3)$개의 간선을 만들 수도 있고, 아니면 각 정점마다 더미 정점을 하나씩 추가해서 구간마다 $O(N)$개씩 총 $O(N^2)$개의 간선을 만들 수도 있습니다.
아무튼 $O(N)$개의 정점과 $O(N^3)$개 이하의 간선을 만들었다면 Floyd-Warshall algorithm을 이용해 모든 정점 쌍에 대한 정답을 구할 수 있습니다.
전체 코드
1 |
|