문제 설명

문제 링크

http://icpc.me/16507

 

16507번: 어두운 건 무서워

첫 번째 줄에는 사진의 크기를 의미하는 정수 R, C (1 ≤ R, C ≤ 1,000)와 사진 일부분의 밝기 평균을 알아볼 개수를 의미하는 정수 Q (1 ≤ Q ≤ 10,000)가 주어진다. 다음 R개의 줄에 걸쳐 R×C 크기의 사

www.acmicpc.net

풀이

2차원 누적합으로 풀 수 있다.

누적합을 이용하지 않고 푼다면 주어진 쿼리를 모두 확인하는 방식으로 푼다면 O(RCQ)로 10억이 넘어가 시간이 터질 것이다.

그렇기 때문에 누적합을 이용하여 쿼리당 O(1)에 구간 합을 구해야 한다.

psum [i][j] : 오른쪽 아래 꼭짓점이 (i, j)에 있을 때 내부에 있는 밝기의 합이라고 할 때,

psum [i][j]는 아래 그림에서 (빨강 + 초록 - 노랑 + 파랑)으로 구할 수 있다

psum

부분 합은 빨강 - 초록 2개 + 파란 네모로 구할 수 있다.

부분 합

평균을 구하기 위해 나눌 수는 (c - a + 1) * (d - b + 1)이다.

코드

#include <cstdio>

int arr[1003][1003];
int psum[1003][1003];

int main() {
    int n, m, q; scanf("%d %d %d", &n, &m, &q);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++) scanf("%d", &arr[i][j]);
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            psum[i][j] = psum[i][j - 1] + psum[i - 1][j] - psum[i - 1][j - 1] + arr[i][j];
        }
    }

    while (q--) {
        int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d);
        int sum = psum[c][d] - psum[c][b - 1] - psum[a - 1][d] + psum[a - 1][b - 1];
        int div = (c - a + 1) * (d - b + 1);
        printf("%d\n", sum / div);
    }
}

'Algorithm > BOJ' 카테고리의 다른 글

백준[1374] 강의실  (0) 2021.10.16
백준[18429] 근손실  (0) 2021.10.16
백준[3015] 오아시스 재결합  (0) 2021.10.15
백준[14428] 수열과 쿼리 16  (0) 2021.10.14
백준[20164] 홀수 홀릭 호석  (0) 2021.10.14
복사했습니다!