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