====== Money for Nothing ====== ===== 풀이 ===== * 문제를 정리하면 구해야 하는 것은 max_(i,j){ (q[i] - p[j]) * (e[i] - d[j]) } (q[i]>p[j], e[i]>d[j]) 이다. * 기하학적으로 이해하면, (q,e)를 우측 상단의 점으로 (p,d)를 좌측 하단의 점으로 갖는 직사각형의 면적이다. * q[i0]>q[i1] 이고 e[i0]>e[i1] 인 i0,i1이 있다면, i1은 최적값이 될수 없다. 따라서 제거해도 된다. * 마찬가지로 p[j0]p[j], e[i]>d[j]) 이 조건이 빠져있었다는 부분이다. 이것을 처리해야 한다. * A[i,j]가 q[i]>p[j], e[i]>d[j] 를 모두 만족할때만 (q[i] - p[j]) * (e[i] - d[j])를 갖고, 나머지 경우에는 -INF를 갖는다고 정의해보자. 이러면 몽주 어레이가 되지는 못한다. 하지만, 여전히 monotone matrix이기는 하다 (..사실 아닌데 그럴거라고 생각했다 ㅜㅜ) 그래서 [[ps:분할정복 최적화]]를 적용하는 데에는 문제가 없어야 한다. 하지만 계속 WA를 받았다.. * 이것이 모노톤하다고 생각한 근거는, i가 주어졌을때 조건을 만족하는 j의 범위를 [l[i], r[i]] 라고 했을때, l[i]와 r[i]가 모두 단조증가한다는 이유였다. 하지만 문제가 된 이유는, l[i]>r[i]인 i가 있을수 있다는 것이었다. 다시 말하면 모든 j에 대해서 -INF값을 갖는 i가 있을 수 있다는 것이다. 이경우에 opt값을 0으로 처리하게 되면 단조성이 깨지게 된다.. (i-1이 j=2에서 최댓값을 갖더라도 찾지 못한다 ㅜㅜ) * 그래서 사용한 해결 방법은.. 모든 i들에 대해서 l[i]와 r[i]를 구해서, 조건을 만족하는 j가 존재하는 i값들에 대해서만 최댓값을 구하는 것이었다. l[i]와 r[i]는 모두 단조증가하므로 다행히도 O(n)에 저 범위를 모두 구할수 있었다. * 다른 코드에서 본 방법은 좀 더 신기하다. ===== 코드 ===== (다이아몬드 이상은 코드 생략) * Dependency: [[:ps:teflib:xxx#yyy|teflib.xxx.yyy]] {{tag>BOJ ps:problems:boj:다이아몬드_4}}