순간을 성실히, 화려함보단 꾸준함을

[ boj : 16507 ] 어두운 건 무서워 본문

알고리즘,SQL/백준,BOJ

[ boj : 16507 ] 어두운 건 무서워

폭발토끼 2022. 1. 29. 18:41

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

 

16507번: 어두운 건 무서워

첫 번째 줄에는 사진의 크기를 의미하는 정수 R, C (1 ≤ R, C ≤ 1,000)와 사진 일부분의 밝기 평균을 알아볼 개수를 의미하는 정수 Q (1 ≤ Q ≤ 10,000)가 주어진다. 다음 R개의 줄에 걸쳐 R×C 크기의 사

www.acmicpc.net

해설 : 전형적인 누적합 문제입니다.

이런 문제는 사실 '암기'에요. 비슷한 문제를 만나지 못했더라면 이번 문제를 통해 무조건 '암기'하시길 바랍니다!!

먼저 평균을 구하기 전에 (1,1)~(i,j) 까지의 누적합을 먼저 구하는게 우선이겠죠?

dp[i][j] = dp[i-1][j]+dp[i][j-1] - dp[i-1][j-1] + arr[i][j]

그리고 난 후에 이제 (x1,y1)~(x2,y2) 까지의 누적합을 구해주어야 합니다.

sum = dp[x2][y2] - (dp[x2][y1-1] + dp[x1-1][y2]) + dp[x1-1][y1-1]

그 후에 칸의 개수 만큼 나누어주면 평균이 되겠죠?

ans = sum/((x2-x1+1)*(y2-y1+1))

#include<bits/stdc++.h>

using namespace std;
using ll = long long;

int arr[1010][1010],dp[1010][1010];

void solve();
int f(ll x);

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t = 1;
	while (t--)solve();
	return 0;
}
void solve()
{
	int r, c, q;
	cin >> r >> c >> q;
	for (int i = 1; i <= r; i++)
		for (int j = 1; j <= c; j++)
			cin >> arr[i][j];

	for (int i = 1; i <= r; i++)
		for (int j = 1; j <= c; j++)
			dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + arr[i][j];

	int x1, y1, x2, y2;
	for (int i = 0; i < q; i++) {
		cin >> x1 >> y1 >> x2 >> y2;
		int out = dp[x2][y2] - (dp[x2][y1 - 1] + dp[x1 - 1][y2]) + dp[x1 - 1][y1 - 1];
		cout << out / ((x2 - x1 + 1) * (y2 - y1 + 1))<<"\n";
	}
}

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

memcpy에 string 형을 쓰면 안될까????  (0) 2022.02.01
[ boj : 2799 ] 블라인드  (0) 2022.01.31
[ boj : 21608 ] 상어 초등학교  (0) 2022.01.28
[ boj : 2343 ] 기타 레슨  (0) 2022.01.28
[ boj : 22868 ] 산책(small)  (0) 2022.01.26