dhsg0717   1년 전

아래에 있는 icpc sinchon 홈페이지에 있는 해설을 보며 풀어보고 있습니다.

https://icpc-sinchon.io/campco...

그런데 분할 한 후 mid, mid + 1 부분을 모두 포함하는 수열의 점수를 구하는 부분에서

right = mid + 1 이라고 할 때,

max(low, mid) <= max(mid + 1, right) 이면서, min(low, mid) >= min(mid + 1, right) 이면

max(mid + 1, right) * min(mid + 1, right) * (mid - low + 1) 로 계산하고

max(low, mid) >= max(mid + 1, right) 이면서, min(low, mid) >= min(mid + 1, right) 이면

min(mid + 1, right) * (mid부터 low까지의 각 구간에서의 max의 합) 으로 계산하고

max(low, mid) <= max(mid + 1, right) 이면서, min(low, mid) <= mid(mid + 1, right) 이면

max(mid + 1, right) * (mid부터 low까지의 각 구간에서의 min의 합) 으로 계산하면

right가 high까지 증가함에 따라 미리 구해놓은 min, max의 구간합을 이용하면, 수열의 점수를 O(1)로 구할 수 있다는 것 까지는 이해가 되었습니다.

그런데

max(low, mid) > max(mid + 1, right) 이면서, min(low, mid) < min(mid + 1, right) 일 때,

해설에서는 이 구간에 속하는 각 부분수열의 점수가 min(left, mid) * max(left, mid) 라고 나와 있습니다.

이 방식을 적용하면 수열이 1 5 3 4 2 일 때,  mid의 값이 3이고 max(low, mid) = 5, min(low, mid) = 1 이므로

부분 수열 1 5 3 4 의 점수는 1 * 5로 5가 맞지만

이 수열의 부분 수열인 3 4 인 경우는 3 * 3이 아닌 3 * 4이어야 하므로 결국 위 방식을 적용하는 것이 아닌 것 같은데

해설이 잘못된 것인지 제가 잘못 이해하는 것인지

그리고 이 경우를 어떻게 구현하면 좋을지 조언해주시면 감사하겠습니다.

댓글을 작성하려면 로그인해야 합니다.