BOJ 5029 Statisticians

BOJ 5029 Statisticians

문제 링크:

문제 내용

RRCC열의 사각 격자의 각 칸에 음이 아닌 정수가 하나씩 적혀 있습니다. 면적이 aa 이상 bb 이하인 직사각형 영역들에 들어 있는 모든 칸의 값들의 평균을 모아서, 그 중 중앙값을 출력하세요.

입력

첫 줄에는 RRCC가 주어집니다. (1R1401 \le R \le 140, 1C1201 \le C \le 120)

다음 줄에는 aabb가 주어집니다. (1abR×C1 \le a \le b \le R \times C)

다음 RR줄에 걸쳐서 사각 격자의 각 칸에 적힌 수들이 주어집니다. 이 수들은 0 이상 10  00010\;000 이하입니다.

출력

문제의 정답을 소수점 이하 세 자리까지 출력하세요. 절대 오차10310^{-3} 미만이면 정답으로 인정됩니다.

문제 풀이

스포일러

먼저 범위 내의 모든 평균값을 2차원 누적합 배열에서 브루트포스하여 구합니다. 그런데 이들 중 중앙값을 구하기 위해 이를 정렬하기에는 시간과 메모리가 부족합니다.

오차 범위 내에서만 정확한 값들을 구하면 00 이상 10710^7 이하의 정수로 퉁칠 수 있고, 이들은 모든 값을 나열하는 대신 개수를 세어 counting sort를 하는 것으로 중앙값을 구할 수 있습니다.

수의 개수가 짝수 개일 경우에 각 수를 정수로 바꿀 때 floor division을 했다면 두 값의 평균을 구하는 과정에서 오차가 누적될 수 있습니다. 따라서 앞의 “퉁치는” 과정에서 반올림을 하거나, 오차의 크기를 반으로 줄여서 0.00050.0005 단위로 정확한 답을 구하여 문제를 해결할 수 있습니다.

Last updated on