[BOJ] 19073. Subsequence Sums

starbow·2024년 7월 14일

PS/CP

목록 보기
16/25

문제 링크

양의 정수로 이루어진 길이가 nn인 수열 A1,,AnA_{1}, \cdots , A_{n}이 있습니다. 그리고 모든 요소의 합이 iiAA의 부분 수열의 갯수를 BiB_{i}로 하는 수열 BB가 있습니다. 우리의 목표는 수열 BB를 통해서 AA를 만들면 되는데 사전순으로 가장 앞에오는 수열을 구해야 합니다.

먼저, 수열 AA의 요소들 중 최솟값은 쉽게 구할 수 있습니다. Ba>0B_{a} > 0이고 B1==Ba1=0B_{1} = \cdots = B_{a-1} = 0이라면 최솟값은 aa이 됩니다.

만약에 최솟값 요소를 포함하는 모든 부분 수열들을 수열 BB에서 제거할 수 있다면 그 다음 작은 요소, 그 다음 작은 요소 순으로 AA의 요소를 하나 하나 찾아갈 수 있고 이를 nn번 반복하면 AA를 완성할 수 있습니다.

그럼 최솟값 요소를 포함하는 모든 부분 수열들을 수열 BB에서 어떻게 제거할 수 있을까요? 이건 아래와 같은 방법으로 할 수 있습니다.

  1. BaB_{a}11 감소시킵니다.
  2. 다음 과정을 aima \leq i \leq mii에 대하여 값이 증가하는 순서대로 수행합니다.
    2-1. Bi>0B_{i} > 0이라면 Bi+aB_{i+a}BiB_{i} 감소시킵니다. aa를 포함하지않은 부분 수열들 중 합이 ii인 부분 수열의 갯수가 BiB_{i}개이고 이 말은 즉, aa를 포함하면서 합이 i+ai+a인 부분 수열의 갯수가 BiB_{i}개라는것을 의미합니다. 그래서 Bi+aB_{i+a}BiB_{i} 감소시킵니다.

이렇게 하면 수열 AA를 구할 수 있습니다. 하지만 정확히는 나올 수 있는 수열 중 하나를 구한 것이긴 합니다. 우리는 그 중 사전순으로 가장 작은 수열을 구해야 하는데 결론부터 말씀드리면 우리가 구한 수열 AA가 사전순으로 가장 작은 수열이 맞습니다.

만약 사전순으로 더 작은 수열 AA'이 있다고 가정해보겠습니다. 그럼 1j<i1 \leq j < i인 모든 양의 정수에 대하여 Aj=AjA_{j} = A'_{j}이고 Ai>AiA_{i} > A'_{i}인 정수 ii가 존재합니다. 하지만 저희가 수열 BB에서 최소 요소를 포함하는 부분 수열을 제거하는 과정을 살펴보면 이건 불가능하다는 것을 알 수 있습니다. 그래서 저희가 구한 수열 AA가 사전순으로 가장 작은 수열임을 알 수 있습니다.

시간 복잡도는 O(nm)O(nm)입니다.

profile
🎈 Journey of problem solving

0개의 댓글