# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1175637 | superauto | Quality Of Living (IOI10_quality) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
int R, C, H, W;
vector<vector<int>> Q;
bool isValid(int val) {
vector<vector<int>> B(R, vector<int>(C, 0));
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
B[i][j] = (Q[i][j] <= val) ? 1 : 0;
}
}
vector<vector<int>> prefixSum(R + 1, vector<int>(C + 1, 0));
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
prefixSum[i][j] = B[i-1][j-1] + prefixSum[i-1][j] + prefixSum[i][j-1] - prefixSum[i-1][j-1];
}
}
int required = (H * W) / 2 + 1;
for (int i = H; i <= R; i++) {
for (int j = W; j <= C; j++) {
int count = prefixSum[i][j] - prefixSum[i-H][j] - prefixSum[i][j-W] + prefixSum[i-H][j-W];
if (count >= required) return true;
}
}
return false;
}
int rectangle(int R, int C, int H, int W, vector<vector<int>>& Q) {
::R = R; ::C = C; ::H = H; ::W = W; ::Q = Q;
int left = 1, right = R * C, answer = right;
while (left <= right) {
int mid = (left + right) / 2;
if (isValid(mid)) {
answer = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return answer;
}
int main() {
cin >> R >> C >> H >> W;
vector<vector<int>> Q(R, vector<int>(C));
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> Q[i][j];
}
}
cout << rectangle(R, C, H, W, Q) << endl;
return 0;
}