※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 25826번 문제인 2차원 배열 다중 업데이트 단일 합이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/25826 

 

25826번: 2차원 배열 다중 업데이트 단일 합

크기가 n x n인 정수형 2차원 배열 A가 주어진다. 배열 A의 원소는 A[0][0], A[0][1], …, A[n - 1][n - 1]이다. 배열 A의 모든 원소의 초깃값은 입력으로 주어진다. 배열 A에 대한 m개의 질의가 저장된 배열 B

www.acmicpc.net

모든 업데이트를 전부 한 뒤 배열의 각 성분이 무엇인지를 빠르게 계산하는 방법으로 (2차원) imos법이 존재하나, 이 문제는 더욱 간단하게 해결할 수 있는 방법이 존재한다.

 

하나뿐인 유형2의 쿼리를 먼저 보고, 유형 2의 쿼리의 영역에 대응되는 초기 배열의 수들의 합에 각 유형1의 쿼리의 영역과 유형2의 쿼리의 영역의 겹치는 칸수만큼 k를 추가해나가는 것으로도 답을 충분히 구할 수 있다.

 

모든 주어진 쿼리들을 주어진 순서대로 이행하며 문제를 해결할 필요는 없다는 점을 기억하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

int N, M;
int arr[1000][1000];
int qry[300000][5];
int rL, rR, cL, cR;
ll ans = 0;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> M;
	for (int r = 0; r < N; r++) {
		for (int c = 0; c < N; c++) {
			cin >> arr[r][c];
		}
	}

	for (int k = 1; k < M; k++) cin >> qry[k][0] >> qry[k][0] >> qry[k][2] >> qry[k][1] >> qry[k][3] >> qry[k][4];
	cin >> rL >> rL >> cL >> rR >> cR;

	for (int r = rL; r <= rR; r++) {
		for (int c = cL; c <= cR; c++) {
			ans += arr[r][c];
		}
	}

	for (int k = 1; k < M; k++) {
		ll rrLL = max(rL, qry[k][0]), rrRR = min(rR, qry[k][1]);
		ll ccLL = max(cL, qry[k][2]), ccRR = min(cR, qry[k][3]);
		if (rrLL <= rrRR && ccLL <= ccRR) {
			ans += (rrRR - rrLL + 1) * (ccRR - ccLL + 1) * qry[k][4];
		}
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 27855 // C++] Cornhole  (0) 2023.03.17
[BOJ 13907 // C++] 세금  (0) 2023.03.17
[BOJ 25943 // C++] 양팔저울  (1) 2023.03.15
[BOJ 1071 // C++] 소트  (0) 2023.03.14
[BOJ 25936 // C++] Rain Gauge  (0) 2023.03.13

+ Recent posts