PS
[백준] 11660번 구간 합 구하기5 (C++)
-minari-
2024. 12. 8. 21:18
https://www.acmicpc.net/problem/11660
문제 설명
2차원 배열이 주어졌을 때, (y1,x1)부터 (y2,x2)까지의 합을 구하는 문제이다.
주요 로직
1. 누적합을 사용하는 것이다.
n의 범위가 1024까지이기에 이중 for문을 사용해서 문제를 풀면 시간 초과가 발생한다
- i행 j열의 누적합 구하기
pfix[i][j]는 1행부터 i행까지, 1열부터 j열까지의 모든 수의 합을 구한 값이다.
pfix[i][j] = pfix[i-1][j] + pfix[i][j-1] - pfix[i-1][j-1] + arr[i][j];
- (y1,x1)부터 (y2,x2)까지의 합 구하기
pfix[y2][x2] - pfix[y1-1][x2] - pfix[y2][x1-1] + pfix[y1-1][x1-1]
정답 코드
#include <iostream>
using namespace std;
int n,m,x1,x2,y1,y2;
int arr[1030][1030], pfix[1030][1030];
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n >> m;
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
cin >> arr[i][j];
pfix[i][j] = arr[i][j] + pfix[i][j-1] + pfix[i-1][j] - pfix[i-1][j-1];
}
}
while(m--){
cin >> y1 >> x1 >> y2 >> x2;
cout << pfix[y2][x2] - pfix[y1-1][x2] - pfix[y2][x1-1] + pfix[y1-1][x1-1] << "\n";
}
return 0;
}