Art Exhibition
문제를 한국어로 설명하면 다음과 같습니다.
크기가 $A_i$이고 가치가 $B_i$인 작품들이 $N$개 있습니다.
이때 가능한 모든 부분집합에 대해 $\sum B_i - (A_{\max} - A_{\min})$의 최댓값을 구하는 문제입니다.
$A_{\max}$와 $A_{\min}$은 각각 집합에서 $A_i$의 최댓값과 최솟값입니다.
풀이
Subtask 1
$N$이 충분히 작으므로 모든 부분집합에 대해서 검사해 볼 수 있습니다.
시간 복잡도는 $O(N2^N)$입니다.
코드
1 | |
Subtask 2
$A_j = A_{\max}$, $A_i = A_{\min}$이 되도록 $i$와 $j$를 잡으면 $A_i \leq A_k \leq A_j$를 만족하는 $k$는 모두 포함하는 것이 이득입니다.
문제에서 주어지는 작품들을 모두 $A_i$를 기준으로 오름차순 정렬합시다.
이제 가능한 모든 쌍 $(i, j)$에 대해 $\sum_{k = i}^j B_k - (A_j - A_i)$를 구하면 답을 찾을 수 있습니다.
$\sum B_k$를 구하는 데 $O(N)$이 걸리므로 총 시간 복잡도는 $O(N^3)$입니다.
코드
1 | |
Subtask 3
Subtask 2의 풀이에서 $\sum B_k$를 누적 합을 이용해서 $O(1)$에 구하면 $O(N^2)$에 해결할 수 있습니다.
코드
1 | |
Subtask 4
$1$부터 $i$까지 $B_i$의 합을 $S_i$라고 합시다.
Subtask 3에서의 답을 식으로 쓰면 $\max(S_j - S_{i - 1} - (A_j - A_i))$입니다.
식을 정리해서 $i$에 대한 부분과 $j$에 대한 부분으로 나누면 $\max((A_i - S_{i - 1}) + (S_j - A_j))$로 쓸 수 있습니다.
이제 $j$를 고정하면 식은 $\max(A_i - S_{i - 1}) + S_j - A_j$가 됩니다.
$j = 1$부터 $N$까지 $1$씩 증가시키며 답을 구해 봅시다. 이전에 구한 $\max(A_i - S_{i - 1})$는 $1$부터 $j$까지의 최댓값이므로 이를 재활용하면 $j + 1$까지의 최댓값을 $O(1)$에 구할 수 있습니다.
따라서 $O(N)$에 문제의 답을 얻을 수 있습니다.
코드
1 | |