# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
173274 | apostoldaniel854 | Bomb (IZhO17_bomb) | C++14 | 529 ms | 61560 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int N = 2500;
char a[1 + N][1 + N];
int lst[1 + N + 1][1 + N + 1];
int nxt[1 + N + 1][1 + N + 1];
int best[1 + N];
int main () {
// freopen ("bomb.in", "r", stdin);
// freopen ("bomb.out", "w", stdout);
ios::sync_with_stdio (false);
cin.tie (0); cout.tie (0);
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j], a[i][j] -= '0';
int mxl = n;
for (int j = 1; j <= m; j++)
for (int i = 1; i <= n; i++) {
if (a[i][j] == 0)
continue;
int k = i;
while (k <= n && a[k + 1][j] == 1)
k++;
mxl = min (mxl, k - i + 1);
i = k;
}
int mxc = m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
if (a[i][j] == 0)
continue;
int k = j;
while (k <= m && a[i][k + 1] == 1)
k++;
mxc = min (mxc, k - j + 1);
j = k;
}
for (int i = 1; i <= n; i++) {
lst[i][0] = 1;
for (int j = 1; j <= m; j++) {
lst[i][j] = lst[i][j - 1];
if (a[i][j] == 0)
lst[i][j] = j + 1;
}
nxt[i][m + 1] = m;
for (int j = m; j > 0; j--) {
nxt[i][j] = nxt[i][j + 1];
if (a[i][j] == 0)
nxt[i][j] = j - 1;
}
}
for (int i = 1; i <= n; i++)
best[i] = m + 1;
for (int j = 1; j <= m; j++) {
int cur = 0;
int l = 0, r = m + 1;
for (int i = 1; i <= n; i++) {
if (a[i][j] == 0)
cur = 0;
else {
cur++;
l = max (l, lst[i][j]);
r = min (r, nxt[i][j]);
best[cur] = min (best[cur], r - l + 1);
}
}
cur = 0;
l = 0, r = m + 1;
for (int i = n; i > 0; i--) {
if (a[i][j] == 0)
cur = 0;
else {
cur++;
l = max (l, lst[i][j]);
r = min (r, nxt[i][j]);
best[cur] = min (best[cur], r - l + 1);
}
}
}
int ans = 0;
for (int i = 1; i <= mxl; i++)
ans = max (ans, min (mxc, best[i]) * i);
cout << ans << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |