문제 링크 :  https://www.acmicpc.net/problem/11660

 

11660번: 구간 합 구하기 5

첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네 개의 정수 x1, y1, x2, y2 가 주어지며, (x1, y1)부터 (x2, y2)의 합을 구해 출력해야 한다. 표에 채워져 있는 수는 1,000보다 작거나 같은 자연수이다. (x1 ≤ x2, y1 ≤ y2)

www.acmicpc.net

 

 문제설명 

 

1. 배열의 크기 N 과 구간의 갯수 M이 주어짐

2. 예를들어 N이 4 구간이 (2 , 2) , (3 , 4)  가주어지면

색칠된 구간의 합을 구하면 된다 .

 

 알고리즘 

 

1.구간합 배열을 2차로 만든다 .

2.  구간이 (2 , 2) , (3 , 4)  가주어지면 

3. 먼저 (1,1) , (3,4) 의 구간합을 구함

   -> 그리고 (1,1) , (1,4) 구간합과 , (1,1) ,(3,1) 구간합을 빼준다 그리고 (1,1)을  더해준다.

점화식 :  result = arr[3][4] -arr[3][1]-arr[1][4]+arr[1][1] 

 

 코드 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
 
using namespace std;
int main() {
    int N, M;
 
    scanf("%d%d"&N, &M);
 
    int sum[1025][1025];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            int a;
            scanf("%d"&a);
            sum[i + 1][j + 1= sum[i][j + 1+ sum[i + 1][j] - sum[i][j] + a;
        }
    }
    for (int i = 0; i < M; i++) {
        int a, b, c, d;
        scanf("%d%d%d%d"&a, &b, &c, &d);
        printf("%d\n", sum[c][d] - sum[c][b - 1- sum[a - 1][d] + sum[a - 1][b - 1]);
    }
}
 
cs

'c++ > 백준' 카테고리의 다른 글

백준 10986 번 : 나머지 합  (0) 2020.04.20
백준 17136번 : 색종이 붙이기  (0) 2020.04.20
백준 17203 번 : ∑|ΔEasyMAX|  (0) 2020.04.20
백준 10597번 : 순열장난  (0) 2020.04.17
백준 2210번 : 숫자판 점프  (0) 2020.04.17
ariz1623