Submission #854637

#TimeUsernameProblemLanguageResultExecution timeMemory
854637The_SamuraiBomb (IZhO17_bomb)C++17
30 / 100
1096 ms31392 KiB
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
const int inf = 1e9, N = 1e6 + 5;

int main() {
    cin.tie(0)->sync_with_stdio(false);
#ifdef sunnatov
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#else
//    freopen("bomb.in", "r", stdin);
//    freopen("bomb.out", "w", stdout);
#endif

    int n, m;
    cin >> n >> m;
    vector<vector<char>> a(n + 1, vector<char>(m + 1));
    vector<vector<int>> pref(n + 1, vector<int>(m + 1));
    for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) {
        cin >> a[i][j];
        pref[i][j] = pref[i][j - 1] + pref[i - 1][j] - pref[i - 1][j - 1] + (int) (a[i][j] == '1');
    }
    auto get_sum = [&](int x1, int y1, int x2, int y2) {
        return pref[x2][y2] - pref[x2][y1 - 1] - pref[x1 - 1][y2] + pref[x1 - 1][y1 - 1];
    };
    auto get = [&](int h) {
        int mn = m;
        vector<int> last(m + 1, -inf);
        for (int i = 1; i <= n; i++) {
            int cnt = 0;
            for (int j = 1; j <= m; j++) {
                if (a[i][j] == '0') {
                    if (cnt > 0) mn = min(mn, cnt);
                    cnt = 0;
                    continue;
                }
                if (i + h - 1 > n) {
                    if (i - last[j] >= h) return 0;
                    cnt++;
                    continue;
                }
                if (i + h - 1 > n or get_sum(i, j, i + h - 1, j) != h) {
                    if (i - last[j] >= h) {
                        return 0;
                    }
                    continue;
                }
                last[j] = i;
                cnt++;
            }
            if (cnt > 0) mn = min(mn, cnt);
        }
        return mn;
    };
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        ans = max(ans, get(i) * i);
    }
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...