문제 링크
- https://icpc.me/27471
사용 알고리즘
- 세그먼트 트리
시간복잡도
- $O(N \log N)$
풀이
시그마가 4개 중첩되어 있지만 별로 복잡하지 않습니다. 길이가 2 이상인 모든 연속한 부분 수열에서, 가능한 모든 원소 쌍에 대해 둘 중 최댓값을 더하는 문제입니다. 즉, $A$의 연속한 부분 수열 $A[l\cdots r]$에서, 모든 $l \leq i < j \ leq r$에 대해 $\max(A_i, A_j)$의 합을 구하는 문제입니다.
$A_i = A_j$인 경우를 처리하는 것이 귀찮을 것 같으니 수를 비교하는 대신 순서쌍 $(A_i, i)$와 $(A_j, j)$를 비교합시다. 이렇게 하면 값이 같더라도 최대가 되는 원소를 항상 일정한 방향으로 고정할 수 있습니다.
더블 카운팅과 비슷한 느낌으로 $A_i$가 최대가 되는 경우의 수를 구합시다. $A_i$의 왼쪽에서 $A_i$ 이하인 값의 개수, 그리고 $A_i$의 오른쪽에 있으면서 $A_i$ 미만인 값의 개수를 구하면 됩니다. 세그먼트 트리를 이용해 $O(N \log N)$ 시간에 계산할 수 있습니다.
전체 코드
1 |
|