https://www.acmicpc.net/problem/17969
17969번: Gene Tree
A gene tree is a tree showing the evolution of various genes or biological species. A gene tree represents the relatedness of specific genes stored at the leaf nodes without assumption about their ancestry. Leaf nodes represent genes, called taxa, and inte
www.acmicpc.net
Tree DP로 풀 수 있는 문제입니다. 편의상 자식노드에 포함된 모든 리프 노드들과 현재 부모노드와의 거리 제곱의 합을 $\sum_{i=1}^{n} a_i^2$, 거리의 합을 $\sum_{i=1}^{n} a_i$, 리프노드의 개수를 $n$이라고 놓겠습니다.
자식노드에서 부모노드로 리프노드들을 가져오는 과정에서 거리가 $k$씩 추가됩니다. 따라서 거리 제곱의 합과 거리의 합을 각각 $\sum_{i=1}^{n} (a_i+k)^2$, $\sum_{i=1}^{n} (a_i+k)$로 갱신시켜줘야 합니다.
먼저 거리 제곱의 합의 식을 풀어서 써보면 다음과 같습니다.
$\sum_{i=1}^{n} (a_i+k)^2 = \sum_{i=1}^{n} a_i^2 + 2k \sum_{i=1}^{n} a_i + \sum_{i=1}^{n}k^2$
$\sum_{i=1}^{n} a_i^2$과 $\sum_{i=1}^{n} a_i$, 그리고 $n$의 값 모두 알고 있기 때문에 식의 값을 $O(1)$에 갱신시켜주는 것이 가능합니다. 거리의 합 역시
$\sum_{i=1}^{n} (a_i+k) = \sum_{i=1}^{n} a_i + \sum_{i=1}^{n} k $
이렇게 식을 풀어볼 수가 있고 거리제곱과 마찬가지로 $O(1)$에 갱신 가능합니다.
이제 서로 다른 자식노드들의 리프노드 거리의 제곱 합을 구해서 답에 더해줘야합니다. 두 자식노드들 간의 거리 제곱의 합은
$\sum_{i=1}^{n} \sum_{j=1}^{m} (a_i+b_j)^2$
가 되며, 이 식을 풀어서 써본다면
$\sum_{i=1}^{n} \sum_{j=1}^{m} (a_i+b_j)^2 = \sum_{i=1}^{n} \sum_{j=1}^{m} a_i^2 + 2\sum_{i=1}^{n} \sum_{j=1}^{m}a_ib_j + \sum_{i=1}^{n} \sum_{j=1}^{m}b_j^2 \\ = m\sum_{i=1}^{n}a_i^2 + 2\sum_{i=1}^{n}a_i \sum_{j=1}^{m}b_j + n\sum_{j=1}^{m}b_j^2$
가 됩니다. 위의 식의 값을 구하기 위해 필요한 값들을 이미 알고 있으므로 이 역시 $O(1)$ 시간에 계산이 가능합니다.
매번 서로 다른 자식 노드 2개를 골라 저 식을 계산하면 $O(n^2)$의 시간이 걸리지만, 누적합을 사용한다면 $O(n)$에 가능해하며, 충분히 시간내로 가능합니다.
이제 부모노드한테 리프노드들을 건네주면 됩니다. 위에서 말한 내용들을 각 노드들에서 실행하면 문제에서 요구하는 답을 얻어낼 수 있습니다.
'문제 풀이' 카테고리의 다른 글
[12937] 좋아하는 배열 2 (0) | 2024.12.27 |
---|---|
[1150] MCMF 없이 백업 증명하기 (2) | 2024.12.01 |
2024 SW-IT Contest 문제 풀이 요약 (0) | 2024.09.28 |
[19060] Secret Permutation (0) | 2023.10.28 |