Skip to content

Commit 5ff0846

Browse files
authored
Merge pull request #1245 from AlgorithmWithGod/khj20006
[20251027] BOJ / P3 / Pyramid / 권혁준
2 parents ef01741 + cdd741f commit 5ff0846

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
```cpp
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
5+
int N, M, A, B, C, D;
6+
int arr[1002][1002]{}, brr[1002][1002]{}, crr[1002][1002]{}, drr[1002][1002]{}, err[1002][1002]{};
7+
8+
int main() {
9+
cin.tie(0)->sync_with_stdio(0);
10+
11+
cin >> M >> N >> B >> A >> D >> C;
12+
for (int i = 1; i <= N; i++) for (int j = 1; j <= M; j++) {
13+
cin >> arr[i][j];
14+
arr[i][j] += arr[i - 1][j] + arr[i][j - 1] - arr[i - 1][j - 1];
15+
}
16+
17+
for (int i = 1; i <= N - A + 1; i++) for (int j = 1; j <= M - B + 1; j++) {
18+
brr[i][j] = arr[i + A - 1][j + B - 1] - arr[i - 1][j + B - 1] - arr[i + A - 1][j - 1] + arr[i - 1][j - 1];
19+
}
20+
21+
for (int i = 1; i <= N - C + 1; i++) for (int j = 1; j <= M - D + 1; j++) {
22+
crr[i][j] = arr[i + C - 1][j + D - 1] - arr[i - 1][j + D - 1] - arr[i + C - 1][j - 1] + arr[i - 1][j - 1];
23+
}
24+
25+
// crr에서 세로 A-2-C+1, 가로 B-2-D+1 만큼의 최솟값 구하기
26+
for (int i = 2; i < N - C + 1; i++) {
27+
deque<pair<int, int>> dq;
28+
for (int j = 2; j < M - D + 1; j++) {
29+
while (!dq.empty() && dq.back().first > crr[i][j]) dq.pop_back();
30+
dq.emplace_back(crr[i][j], j);
31+
while (!dq.empty() && j - dq.front().second > B - 2 - D + 1) dq.pop_front();
32+
drr[i][j] = dq.front().first;
33+
}
34+
}
35+
36+
for (int j = 2; j < M - D + 1; j++) {
37+
deque<pair<int, int>> dq;
38+
for (int i = 2; i < N - C + 1; i++) {
39+
while (!dq.empty() && dq.back().first > drr[i][j]) dq.pop_back();
40+
dq.emplace_back(drr[i][j], i);
41+
while (!dq.empty() && i - dq.front().second > A - 2 - C + 1) dq.pop_front();
42+
err[i][j] = dq.front().first;
43+
}
44+
}
45+
46+
int ans = -1;
47+
int w = -1, x = -1;
48+
for (int i = 1; i <= N - A + 1; i++) for (int j = 1; j <= M - B + 1; j++) {
49+
int res = arr[i][j] - err[i + 1][j + 1];
50+
if (res > ans) {
51+
w = i, x = j;
52+
ans = res;
53+
}
54+
}
55+
int y = -1, z = -1;
56+
for (int i = w + 1; i <= w + A - 2 - C + 1; i++) for (int j = x + 1; j <= x + B - 2 - D + 1; j++) {
57+
if (err[i][j] == arr[i - 1][j - 1] - ans) {
58+
return cout << x << ' ' << w << '\n' << j << ' ' << i, 0;
59+
}
60+
}
61+
62+
63+
}
64+
``

0 commit comments

Comments
 (0)