250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준#BOJ#12865#평범한배낭
- 백준#BOJ#2615#오목
- 백준#boj#16932#모양만들기
- 백준#BOJ#1939#중량제한
- 백준#BOJ#8012#한동이는영업사원
- 백준#BOJ#14501#퇴사#브루트포스
- 백준#boj#12755
Archives
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
[ boj : 16507 ] 어두운 건 무서워 본문
https://www.acmicpc.net/problem/16507
해설 : 전형적인 누적합 문제입니다.
이런 문제는 사실 '암기'에요. 비슷한 문제를 만나지 못했더라면 이번 문제를 통해 무조건 '암기'하시길 바랍니다!!
먼저 평균을 구하기 전에 (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 |