문제 링크
- https://icpc.me/24942
문제 출처
- 2021/2022 JOISC Day1 1번
사용 알고리즘
- 위상 정렬
- 스파스 테이블
시간복잡도
- $O(N \log N + M)$
풀이
먼저 선형 구조에서 문제를 해결해 봅시다. 선형 구조에서는 역전이 있으면 불가능하고, 그렇지 않은 경우에는 항상 가능하다는 것을 알 수 있습니다. 또한, 역전이 없을 때는 각 사람을 중간에 멈추지 않고 한 번에 옮길 수 있습니다.
잘 생각해 보면 이 성질은 트리에서도 성립한다는 것을 알 수 있습니다. 즉, $S_i$와 $T_i$를 잇는 경로에 다른 정점 $S_j$ 또는 $T_j$가 없으면 $i$번째 사람을 한 번에 옮길 수 있습니다.
트리 위의 두 경로 $(S_1, T_1)$과 $(S_2, T_2)$를 생각해 봅시다. 만약 경로에 겹치는 부분이 없으면 두 경로의 이동 순서는 상관 없습니다. 또한, 경로의 중간 지점만 겹치는 상황에서도 두 경로의 순서는 상관 없습니다. $S$ 또는 $T$가 다른 경로 위에 놓인 경우만 생각해도 됩니다.
만약 $S_1 - S_2 - T_1$ 경로가 존재하면 $(S_2, T_2)$가 먼저 이동해야 합니다. 반대로 $S_1 - T_2 - T_1$ 경로가 존재하면 $(S_1, T_1)$이 먼저 이동해야 합니다. 정점이 $M$개인 방향 그래프의 위상 정렬로 모델링할 수 있습니다.
단순히 간선을 $O(M^2)$개 생성하면 문제를 해결할 수 없습니다. 하지만 세그먼트 트리를 이용해 그래프의 간선을 줄이는 테크닉과 비슷하게, 스파스 테이블을 이용하면 간선을 $(N \log N + M)$개로 줄일 수 있습니다.
따라서 전체 문제를 $O((N+M) \log N)$ 시간에, $O(1)$ LCA를 사용하면 $O(N \log N + M)$ 시간에 해결할 수 있습니다.
전체 코드
1 |
|