본문 바로가기
문제/백준

c++ 백준_11660_"구간 합 구하기 5"

by 나 진짜 못차마 2023. 6. 11.
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