[BOJ] 9006. 다리

starbow·2024년 6월 21일

PS/CP

목록 보기
13/25

문제 링크

강의 왼쪽에 nn개, 오른쪽에 mm개의 집이 있습니다. 왼쪽에 있는 집의 좌표는 (1,ai)(-1, a_{i}), 오른쪽에 있는 집의 좌표는 (1,bj)(1, b_{j})이고 왼쪽 집에서 오른쪽 집으로 가는 모든 거리의 합을 최소화하는 다리의 위치를 출력해야 합니다. 즉, i,j(aih+2+bjh)\displaystyle\sum_{\forall i, j} {(|a_{i} - h| + 2 + |b_{j} - h|)}의 값이 최소가 되는 hh를 찾아 출력하면 됩니다.

먼저 i,j(aih+2+bjh)\displaystyle\sum_{\forall i, j} {(|a_{i} - h| + 2 + |b_{j} - h|)}2mn+mi=1naih+nj=1mbjh2mn + m \cdot \displaystyle\sum_{i=1}^{n} |a_{i} - h| + n \cdot \displaystyle\sum_{j=1}^{m} {|b_{j} - h|}와 값이 같습니다.

i,j(aih+2+bjh)=i=1nj=1m(aih+2+bjh)=i=1n(maih+2m+j=1mbjh)=2mn+mi=1naih+i=1nj=1mbjh=2mn+mi=1naih+j=1mi=1nbjh=2mn+mi=1naih+nj=1mbjh\begin{aligned} & \displaystyle\sum_{\forall i, j} {(|a_{i} - h| + 2 + |b_{j} - h|)} \\ = \, & \displaystyle\sum_{i=1}^{n} {\displaystyle\sum_{j=1}^{m} {(|a_{i} - h| + 2 + |b_{j} - h|)}} \\ = \, & \displaystyle\sum_{i=1}^{n} {(m \cdot |a_{i} - h| + 2m + \displaystyle\sum_{j=1}^{m} {|b_{j} - h|})} \\ = \, & 2mn + m \cdot \displaystyle\sum_{i=1}^{n} |a_{i} - h| + \displaystyle\sum_{i=1}^{n}\displaystyle\sum_{j=1}^{m} {|b_{j} - h|} \\ = \, & 2mn + m \cdot \displaystyle\sum_{i=1}^{n} |a_{i} - h| + \displaystyle\sum_{j=1}^{m}\displaystyle\sum_{i=1}^{n} {|b_{j} - h|} \\ = \, & 2mn + m \cdot \displaystyle\sum_{i=1}^{n} |a_{i} - h| + n \cdot \displaystyle\sum_{j=1}^{m} {|b_{j} - h|} \end{aligned}

hh값에 따라 위 식은 Ah+BAh+B꼴로 표현할 수 있습니다. 또한 hh 값이 커지면 커질수록 AA 또한 단조증가합니다. 즉, hh를 절댓값이 충분히 큰 음수부터 시작해서 값을 늘려나가면 위 식의 값은 작아지다가 어느 순간 커지게 됩니다. 그리고 증가/감소 상태가 바뀌는 시점의 hh 값이 위 식의 값이 최소가 되는 지점입니다.

우리는 값이 최소가 되는 hh 중에서 가장 작은 값을 출력해야 하므로 hh를 절댓값이 충분히 큰 음수부터 시작해서 점차 늘려가면서 AA값을 확인하다가 A0A \geq 0이 되는 순간의 hh 값을 출력하면 됩니다. 시간복잡도는 O((n+m)log(n+m))O((n+m)\log{(n+m)})입니다.

profile
🎈 Journey of problem solving

0개의 댓글