728x90
https://www.acmicpc.net/problem/11660
11660번: 구간 합 구하기 5
첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네
www.acmicpc.net
일단
행 방향으로 누적합을 구했다
그럼 그림의 예시는
1 3 6 10
2 5 9 14
3 7 12 18
4 9 15 22
가 된다.
(2,2) 에서 (3,4) 까지 합은
정해둔 범위(빨간색)에서
가장 오른쪽(초록색)은
해당 범위 내 모든 행렬 값의
최종 누적합이 된다.
그 값에서
정해둔 범위의 바로 왼쪽(주황색) 값들을
빼주면
해당 범위의 합이 나온다.

#include <iostream>
#include <vector>
using namespace std;
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
vector<vector<int>> num(N + 1, vector<int>(N + 1,0));
vector<vector<int>> arr(N + 1, vector<int>(N + 1,0));
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> num[i][j];
arr[i][j] = num[i][j];
}
}
for (int i = 1; i <= N; i++) {
for (int j = 2; j <= N; j++) {
arr[i][j] += arr[i][j - 1];
}
}
int x1, y1, x2, y2;
for (int i = 0; i < M; i++) {
cin >> x1 >> y1 >> x2 >> y2;
int result = 0;
if (x1 != x2 && y1 != y2) {
for (int k = x1; k <= x2; k++) {
result += arr[k][y2];
}
for (int k = x1; k <= x2; k++) {
result -= arr[k][y1 - 1];
}
}
else if (x1 == x2 && y1 != y2) {
result = arr[x2][y2];
result -= arr[x1][y1 - 1];
}
else if (x1 != x2 && y1 == y2) {
for (int k = x1; k <= x2; k++) {
result += arr[k][y2] - arr[k][y1 - 1];
}
}
else if (x1 == x2 && y1 == y2) {
result = num[x1][y1];
}
cout << result << "\n";
}
}

728x90
'문제 > 백준' 카테고리의 다른 글
| c++_백준_12865_"평범한 배낭" (1) | 2023.06.11 |
|---|---|
| c++ 백준_15663_"N과 M (9)" (0) | 2023.06.11 |
| c++ 백준_5430_"AC" (0) | 2023.06.11 |
| c++ 백준_9935_"문자열 폭발" (1) | 2023.06.11 |
| c++ 백준_2638_"치즈" (0) | 2023.06.11 |