www.acmicpc.net/problem/11660

 

11660번: 구간 합 구하기 5

첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네

www.acmicpc.net


  • 입력받은 (x1,y1) ~ (x2,y2) 의 위치를 하나씩 더해줄 경우 시간초과가 발생하게 된다.
  • 해당 구간은 무조건 직사각형의 모양이 되므로, 특정한 규칙을 찾아볼 수 있다.
  • 누적합의 기준이 될 축을 행으로 설정하면, (x1,y1) ~ (x2,y2) 구간의 합 = (x1~x2, y2) - (x1~x2, y1) 이 된다.
  • 값을 입력받을 때, 각 위치마다 행의 누적합 값을 구해놓으면 쉽게 풀 수 있다.

#include <iostream>

using namespace std;

int data[1025][1025];
int ans[1025][1025];
int n, m;
int x1, y1, x2, y2;

int main(void)
{
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    cin >> n >> m;
    for(int r = 1 ; r <= n ; r++)
    {
        for(int c = 1 ; c <= n ; c++)
        {
            cin >> data[r][c];
            ans[r][c] = ans[r][c-1] + data[r][c];       // 각 위치의 누적합은 해당 행만의 누적합이 된다
        }
    }
    for(int i = 0 ; i < m ; i++)
    {
        cin >> x1 >> y1 >> x2 >> y2;
        int answer = 0;
        for(int r = x1 ; r <= x2 ; r++)                 // 입력 받은 범위의 행들의 누적합을 더해준다
        {
            answer += ans[r][y2] - ans[r][y1-1];        // y2 위치의 누적합 - y1 위치의 누적합
        }

        cout << answer << '\n';
    }
}

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

[백준] 2003.cpp : 수들의 합 2  (0) 2020.08.14
[백준] 16953.cpp : A -> B  (0) 2020.08.10
[백준] 5639.cpp : 이진 검색 트리  (0) 2020.08.06
[백준] 15666.cpp : N과 M (12)  (0) 2020.08.05
[백준] 1991.cpp : 트리 순회  (0) 2020.08.04

+ Recent posts