문제 링크 : 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 |
문제 링크 : 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 |