아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

다원소 이진 탐색 트리

시간 제한1초메모리 제한1024 MB

요약
정렬된 검색 확률과 레벨별 노드 용량이 주어질 때, 다중 원소 이진 탐색 트리의 최소 평균 탐색 연산 횟수를 구한다.
난이도

보통10점 중 7점

유형
동적 계획법, 트리, 이분 탐색
정답자
아직 제출이 없습니다

문제

다중 원소 이진 탐색 트리는 각 노드가 여러 개의 원소를 담을 수 있다는 점에서 보통의 이진 탐색 트리와 다르다. 다만 이진 탐색 트리의 핵심 조건은 일반화된 형태로 그대로 성립한다. 임의의 노드에 대해, 그 노드의 왼쪽 서브트리에 있는 모든 원소는 그 노드가 담고 있는 모든 원소보다 작아야 하고, 오른쪽 서브트리에 있는 모든 원소는 그 노드의 모든 원소보다 커야 한다.

따라서 다중 원소 이진 탐색 트리에서도 보통의 이진 탐색 트리와 똑같은 방식으로 원소를 찾을 수 있다. 각 노드에서 우리는 찾는 원소가 이 노드에 있는지, 아니면 왼쪽 서브트리로 내려가야 하는지 오른쪽 서브트리로 내려가야 하는지를 판단한다. 이 판단 한 번을 연산 한 번으로 셀 때, 어떤 원소를 담고 있는 노드에 도달하는 데 필요한 연산 횟수는 트리의 루트에서 그 노드까지의 레벨 수와 정확히 같다(루트의 레벨을 11로 둔다).

노드 메모리 관리의 특성 때문에, 한 노드가 담을 수 있는 원소의 최대 개수는 레벨마다 다르다. 루트의 레벨을 11이라 하면, 레벨 ii의 한 노드가 담을 수 있는 원소의 최대 개수 mim_i는 주어진 정수 MM, KK, DjD_j에 대해 다음과 같이 정의된다.

mi={M(i=1)max⁡(1, mi−1−D((i−2) mod K)+1)(i>1)m_i = \begin{cases} M & (i = 1) \\ \max\bigl(1,\ m_{i-1} - D_{((i-2) \bmod K) + 1}\bigr) & (i > 1) \end{cases}

즉 레벨이 하나 깊어질 때마다 빼는 값 DjD_j는 레벨 22에서 D1D_1, 레벨 33에서 D2D_2, …\ldots, 레벨 K+1K+1에서 DKD_K를 쓰고, 레벨 K+2K+2에서 다시 D1D_1로 돌아가는 식으로 순환한다. 예를 들어 M=4M = 4, K=2K = 2, D1=1D_1 = 1, D2=2D_2 = 2이면 루트 노드에는 최대 m1=M=4m_1 = M = 4개, 그 직계 자식 노드에는 각각 최대 m2=m1−D1=4−1=3m_2 = m_1 - D_1 = 4 - 1 = 3개, 그 아래 자식 노드에는 각각 m3=m2−D2=3−2=1m_3 = m_2 - D_2 = 3 - 2 = 1개, 그리고 그보다 깊은 모든 레벨에서는 각 노드마다 최대 mi=1m_i = 1개의 원소를 담을 수 있다.

또한 트리를 사용할 때 서로 다른 원소가 서로 다른 확률로 검색되므로, 균형 잡힌 트리가 항상 평균 검색 시간을 최소로 만들지는 않는다. 예를 들어 가장 작은 원소가 압도적으로 자주 검색된다면 그 원소를 루트 노드에 두는 것이 유리하며, 이 경우 왼쪽 서브트리 전체는 비어 있게 된다.

주어진 원소들의 집합과 각 원소의 검색 확률에 대해, 원소 하나를 검색하는 데 드는 평균 연산 횟수가 최소가 되도록 만든 최적 형태의 다중 원소 이진 탐색 트리에서 그 최소 평균 연산 횟수를 구하여라.

입력

첫째 줄에 세 정수 NN, MM, KK가 주어진다. NN은 집합의 원소 개수로 1≤N≤1001 \le N \le 100이고, 1≤M≤N1 \le M \le N, 1≤K≤N1 \le K \le N이다. 이어지는 KK개의 줄에는 각각 정수 하나가 주어지는데, j+1j+1번째 줄의 값이 DjD_j이며 0≤Dj≤M0 \le D_j \le M이다. 마지막 줄에는 NN개의 실수 PiP_i가 주어진다(0≤Pi≤10 \le P_i \le 1, ∑i=1NPi=1\sum_{i=1}^{N} P_i = 1). PiP_i는 각 원소가 검색될 확률이며, 원소의 값 순서대로 주어진다(첫 번째 확률이 가장 작은 원소에 대응한다). 원소들의 실제 값은 풀이에 영향을 주지 않으며, 모두 서로 다르다고 가정해도 된다.

출력

최적 형태의 트리에서 검색 한 번에 드는 최소 평균 연산 횟수를 한 줄에 출력한다. 소수점 아래 정확히 77자리까지 반올림하여 출력한다.

힌트

다음은 두 번째 테스트 케이스에 대한 최적 트리의 모양이다.

예제2

  1. 예제 1

    입력
    4 2 1
    2
    0.2 0.2 0.3 0.3
    
    예상 출력
    1.5000000
    
  2. 예제 2

    입력
    13 4 2
    1
    0
    0.06 0.06 0.06 0.06 0.06 0.06 0.115 0.115 0.115 0.115 0.06 0.06 0.06
    
    예상 출력
    1.7200000