문제 링크
- http://icpc.me/13514
사용 알고리즘
- Centroid Decomposition
풀이
주어진 트리에서 Centroid Decomposition을 해서, Centroid Tree를 만들어주고 시작합시다.
set을 N개 관리할건데, i번 set에는 Centroid Tree상에서 루트와 i번 정점을 잇는 경로에 있는 흰색 정점과 i번 정점의 거리를 저장합니다.
Centroid Tree의 높이는 lgN이기 때문에, set에는 최대 lgN개의 정점이 들어가게 됩니다.
1 |
|
N개의 set을 잘 구해놓았다면, 쿼리는 간단합니다.
트리에서 임의의 정점 u와 v를 잇는 경로는 Centroid Tree 상에서 u와 v의 lca를 기준으로 나눌 수 있습니다.
그러므로 Centroid Tree상의 v의 선조를 모두 살펴보면 v와 다른 노드 사이의 모든 경로의 정보를 알 수 있습니다.
위에서 언급했던 Centroid Tree의 성질(Centroid Tree의 높이 = lgN)에 의해, 각 쿼리는 set의 시간 복잡도까지 합쳐서 O(lgn * lglgn)에 처리할 수 있습니다.
전체 코드
1 |
|