Submission #1161076

#TimeUsernameProblemLanguageResultExecution timeMemory
1161076MisterReaperBomb (IZhO17_bomb)C++20
100 / 100
241 ms56364 KiB
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

constexpr int inf = int(1E9) + 5;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N, M;
    std::cin >> N >> M;
    std::vector<std::string> A(N);
    for (int i = 0; i < N; ++i) {
        std::cin >> A[i];
    }

    int x = M, y = N;
    for (int r = 0; r < N; ++r) {
        for (int i = 0, j = 0; i < M; i = j) {
            if (A[r][i] == '0') {
                j++;
            } else {
                while (j < M && A[r][j] == '1') {
                    j++;
                }
                x = std::min(x, j - i);
            }
        }
    }
    for (int c = 0; c < M; ++c) {
        for (int i = 0, j = 0; i < N; i = j) {
            if (A[i][c] == '0') {
                j++;
            } else {
                while (j < N && A[j][c] == '1') {
                    j++;
                }
                y = std::min(y, j - i);
            }
        }
    }

    debug(x, y);

    std::vector<std::vector<int>> lef(N, std::vector<int>(M));
    std::vector<std::vector<int>> rig(N, std::vector<int>(M));
    for (int r = 0; r < N; ++r) {
        for (int i = 0; i < M; ++i) {
            if (A[r][i] == '1') {
                lef[r][i] = (i ? lef[r][i - 1] : 0) + 1;
            }
        }
        for (int i = M - 1; i >= 0; --i) {
            if (A[r][i] == '1') {
                rig[r][i] = (i == M - 1 ? 0 : rig[r][i + 1]) + 1;
            }
        }
    }

    std::vector<int> mx(N + 1, x);
    for (int j = 0; j < M; ++j) {
        int len = 0, lo = inf, hi = inf;
        for (int i = 0; i < N; ++i) {
            if (A[i][j] == '0') {
                len = 0;
                lo = inf;
                hi = inf;
            } else {
                len++;
                lo = std::min(lo, lef[i][j]);
                hi = std::min(hi, rig[i][j]);
                mx[len] = std::min(mx[len], lo + hi - 1);   
            }
        }
        len = 0, lo = inf, hi = inf;
        for (int i = N - 1; i >= 0; --i) {
            if (A[i][j] == '0') {
                len = 0;
                lo = inf;
                hi = inf;
            } else {
                len++;
                lo = std::min(lo, lef[i][j]);
                hi = std::min(hi, rig[i][j]);
                mx[len] = std::min(mx[len], lo + hi - 1);   
            }
        }
    }

    debug(mx);

    i64 ans = 0;
    for (int i = 1; i <= y; ++i) {
        mx[i] = std::min(mx[i], mx[i - 1]);
        ans = std::max(ans, 1LL * mx[i] * i);
    }

    std::cout << ans << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...