Processing math: 100%
본문 바로가기

문제 풀이

[17969] Gene Tree

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+2kni=1ai+ni=1k2

 

ni=1a2ini=1ai, 그리고 n의 값 모두 알고 있기 때문에 식의 값을 O(1)에 갱신시켜주는 것이 가능합니다. 거리의 합 역시

 

ni=1(ai+k)=ni=1ai+ni=1k

 

이렇게 식을 풀어볼 수가 있고 거리제곱과 마찬가지로 O(1)에 갱신 가능합니다. 

 

이제 서로 다른 자식노드들의 리프노드 거리의 제곱 합을 구해서 답에 더해줘야합니다. 두 자식노드들 간의 거리 제곱의 합은 

 

ni=1mj=1(ai+bj)2

 

가 되며, 이 식을 풀어서 써본다면

 

ni=1mj=1(ai+bj)2=ni=1mj=1a2i+2ni=1mj=1aibj+ni=1mj=1b2j=mni=1a2i+2ni=1aimj=1bj+nmj=1b2j

 

가 됩니다. 위의 식의 값을 구하기 위해 필요한 값들을 이미 알고 있으므로 이 역시 O(1) 시간에 계산이 가능합니다.

매번 서로 다른 자식 노드 2개를 골라 저 식을 계산하면 O(n2)의 시간이 걸리지만, 누적합을 사용한다면 O(n)에 가능해하며, 충분히 시간내로 가능합니다. 

이제 부모노드한테 리프노드들을 건네주면 됩니다. 위에서 말한 내용들을 각 노드들에서 실행하면 문제에서 요구하는 답을 얻어낼 수 있습니다.

'문제 풀이' 카테고리의 다른 글