다원소 이진 탐색 트리
시간 제한1초메모리 제한1024 MB
정렬된 검색 확률과 레벨별 노드 용량이 주어질 때, 다중 원소 이진 탐색 트리의 최소 평균 탐색 연산 횟수를 구한다.
문제
다중 원소 이진 탐색 트리는 각 노드가 여러 개의 원소를 담을 수 있다는 점에서 보통의 이진 탐색 트리와 다르다. 다만 이진 탐색 트리의 핵심 조건은 일반화된 형태로 그대로 성립한다. 임의의 노드에 대해, 그 노드의 왼쪽 서브트리에 있는 모든 원소는 그 노드가 담고 있는 모든 원소보다 작아야 하고, 오른쪽 서브트리에 있는 모든 원소는 그 노드의 모든 원소보다 커야 한다.
따라서 다중 원소 이진 탐색 트리에서도 보통의 이진 탐색 트리와 똑같은 방식으로 원소를 찾을 수 있다. 각 노드에서 우리는 찾는 원소가 이 노드에 있는지, 아니면 왼쪽 서브트리로 내려가야 하는지 오른쪽 서브트리로 내려가야 하는지를 판단한다. 이 판단 한 번을 연산 한 번으로 셀 때, 어떤 원소를 담고 있는 노드에 도달하는 데 필요한 연산 횟수는 트리의 루트에서 그 노드까지의 레벨 수와 정확히 같다(루트의 레벨을 로 둔다).
노드 메모리 관리의 특성 때문에, 한 노드가 담을 수 있는 원소의 최대 개수는 레벨마다 다르다. 루트의 레벨을 이라 하면, 레벨 의 한 노드가 담을 수 있는 원소의 최대 개수 는 주어진 정수 , , 에 대해 다음과 같이 정의된다.
즉 레벨이 하나 깊어질 때마다 빼는 값 는 레벨 에서 , 레벨 에서 , , 레벨 에서 를 쓰고, 레벨 에서 다시 로 돌아가는 식으로 순환한다. 예를 들어 , , , 이면 루트 노드에는 최대 개, 그 직계 자식 노드에는 각각 최대 개, 그 아래 자식 노드에는 각각 개, 그리고 그보다 깊은 모든 레벨에서는 각 노드마다 최대 개의 원소를 담을 수 있다.
또한 트리를 사용할 때 서로 다른 원소가 서로 다른 확률로 검색되므로, 균형 잡힌 트리가 항상 평균 검색 시간을 최소로 만들지는 않는다. 예를 들어 가장 작은 원소가 압도적으로 자주 검색된다면 그 원소를 루트 노드에 두는 것이 유리하며, 이 경우 왼쪽 서브트리 전체는 비어 있게 된다.
주어진 원소들의 집합과 각 원소의 검색 확률에 대해, 원소 하나를 검색하는 데 드는 평균 연산 횟수가 최소가 되도록 만든 최적 형태의 다중 원소 이진 탐색 트리에서 그 최소 평균 연산 횟수를 구하여라.
입력
첫째 줄에 세 정수 , , 가 주어진다. 은 집합의 원소 개수로 이고, , 이다. 이어지는 개의 줄에는 각각 정수 하나가 주어지는데, 번째 줄의 값이 이며 이다. 마지막 줄에는 개의 실수 가 주어진다(, ). 는 각 원소가 검색될 확률이며, 원소의 값 순서대로 주어진다(첫 번째 확률이 가장 작은 원소에 대응한다). 원소들의 실제 값은 풀이에 영향을 주지 않으며, 모두 서로 다르다고 가정해도 된다.
출력
최적 형태의 트리에서 검색 한 번에 드는 최소 평균 연산 횟수를 한 줄에 출력한다. 소수점 아래 정확히 자리까지 반올림하여 출력한다.
힌트
다음은 두 번째 테스트 케이스에 대한 최적 트리의 모양이다.
