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로 풀 수 있는 문제입니다. 편의상 자식노드에 포함된 모든 리프 노드들과 현재 부모노드와의 거리 제곱의 합을 ∑ni=1a2i, 거리의 합을 ∑ni=1ai, 리프노드의 개수를 n이라고 놓겠습니다.
자식노드에서 부모노드로 리프노드들을 가져오는 과정에서 거리가 k씩 추가됩니다. 따라서 거리 제곱의 합과 거리의 합을 각각 ∑ni=1(ai+k)2, ∑ni=1(ai+k)로 갱신시켜줘야 합니다.
먼저 거리 제곱의 합의 식을 풀어서 써보면 다음과 같습니다.
∑ni=1(ai+k)2=∑ni=1a2i+2k∑ni=1ai+∑ni=1k2
∑ni=1a2i과 ∑ni=1ai, 그리고 n의 값 모두 알고 있기 때문에 식의 값을 O(1)에 갱신시켜주는 것이 가능합니다. 거리의 합 역시
∑ni=1(ai+k)=∑ni=1ai+∑ni=1k
이렇게 식을 풀어볼 수가 있고 거리제곱과 마찬가지로 O(1)에 갱신 가능합니다.
이제 서로 다른 자식노드들의 리프노드 거리의 제곱 합을 구해서 답에 더해줘야합니다. 두 자식노드들 간의 거리 제곱의 합은
∑ni=1∑mj=1(ai+bj)2
가 되며, 이 식을 풀어서 써본다면
∑ni=1∑mj=1(ai+bj)2=∑ni=1∑mj=1a2i+2∑ni=1∑mj=1aibj+∑ni=1∑mj=1b2j=m∑ni=1a2i+2∑ni=1ai∑mj=1bj+n∑mj=1b2j
가 됩니다. 위의 식의 값을 구하기 위해 필요한 값들을 이미 알고 있으므로 이 역시 O(1) 시간에 계산이 가능합니다.
매번 서로 다른 자식 노드 2개를 골라 저 식을 계산하면 O(n2)의 시간이 걸리지만, 누적합을 사용한다면 O(n)에 가능해하며, 충분히 시간내로 가능합니다.
이제 부모노드한테 리프노드들을 건네주면 됩니다. 위에서 말한 내용들을 각 노드들에서 실행하면 문제에서 요구하는 답을 얻어낼 수 있습니다.
'문제 풀이' 카테고리의 다른 글
[12937] 좋아하는 배열 2 (1) | 2024.12.27 |
---|---|
[1150] MCMF 없이 백업 증명하기 (3) | 2024.12.01 |
2024 SW-IT Contest 문제 풀이 요약 (0) | 2024.09.28 |
[19060] Secret Permutation (0) | 2023.10.28 |