문제 링크
- http://icpc.me/20188
문제 출처
- 2020 KOI 2차 초등부 3번
- 2020 KOI 2차 중등부 2번
사용 알고리즘
- 트리 DP
시간복잡도
- $O(N)$
풀이
모든 경로 길이의 합과 루트에서 어떤 두 정점의 LCA로 가는 경로로 나눠서 생각합니다.
모든 경로 길이의 합은 각 간선이 사용되는 횟수를 구해서 모두 더해주면 됩니다.
정점 $p, c$($p$가 부모 정점)를 연결하는 간선 $(p, c)$가 사용되는 횟수는 $S_c \cdot (N-S_c)$입니다.(단, $S_v$는 $v$를 루트로 하는 서브 트리의 크기)
루트에서 어떤 두 정점의 LCA로 가는 경로의 길이 합은 각 정점이 LCA가 되는 경우의 수를 구하면 됩니다. 정점 $p$의 자식들을 각각 $c_1, c_2, \cdots , c_k$라고 할 때, 정점 $p$가 LCA가 되는 경우의 수는 ${S_p \choose 2} - \sum_{i=1}^{k} {S_{c_i} \choose 2}$입니다.
전체 코드
1 |
|