문제 링크
- http://icpc.me/13516
사용 알고리즘
- sqrt decomposition
풀이
intended solution은 Tree DP를 HLD로 최적화해주는 것인데, 트리와 쿼리 6에 비해 구현이 매우 더럽다는 소문을 들었습니다.
저는 그냥 sqrt decomposition을 사용했습니다.
쿼리를 $O(\sqrt Q)$개씩 묶어서 처리를 할 것입니다. $O(\sqrt Q)$개씩 분할한 각각의 조각을 “쿼리 묶음”이라고 합시다.
각 쿼리 묶음을 처리하기 전에, 해당 쿼리 묶음에서 색깔이나 가중치가 바뀌지 않으면서 색깔이 같은 인접한 정점들을 미리 union해줄 것입니다. 한 쿼리 묶음에서 색깔이나 가중치가 바뀌는 정점은 최대 $O(\sqrt Q)$개입니다.
정점들을 잘 묶어준 트리를 만들었으면, 쿼리 묶음에 있는 쿼리들을 하나씩 보면서 1/3번 쿼리는 그냥 색/가중치를 바꿔주면 되고, 2번 쿼리는 압축된 트리 위에서 bfs를 돌려주면 됩니다.
union-find에서 각 집합에 속한 정점의 가중치의 최댓값을 들고 있으면 간단하게 처리해줄 수 있습니다.
전체 코드
1 |
|