Submission #100306

#TimeUsernameProblemLanguageResultExecution timeMemory
100306naoaiBomb (IZhO17_bomb)C++14
100 / 100
603 ms62716 KiB
#include <bits/stdc++.h>

using namespace std;

#define fin cin
#define fout cout
//ifstream fin("x.in"); ofstream fout("x.out");

const int nmax = 2500 + 5;
const int inf = 1 << 30;

int n, m;
int v[nmax + 1][nmax + 1];
int u[nmax + 1][nmax + 1];

int w[nmax + 1];
int st[nmax + 1][nmax + 1], dr[nmax + 1][nmax + 1];
string s[nmax + 1];

void check (int h, int w) {
    for (int i = 1; i <= n; ++ i) {
        for (int j = 1; j <= m; ++ j) {
            v[i][j] = v[i - 1][j] + v[i][j - 1] - v[i - 1][j - 1] + (s[i][j - 1] - '0');
        }
    }

    bool ok = 1;
    for (int i = 1; i <= n - h + 1; ++ i) {
        for (int j = 1; j <= m - w + 1; ++ j) {
            int sum = v[i + h - 1][j + w - 1] - v[i - 1][j + w - 1] - v[i + h - 1][j - 1] + v[i - 1][j - 1];
            if (sum == h * w) {
                ++ u[i][j];
                ++ u[i + h][j + w];
                -- u[i + h][j];
                -- u[i][j + w];
            }
        }
    }

    for (int i = 1; i <= n; ++ i) {
        for (int j = 1; j <= m; ++ j) {
            u[i][j] += u[i - 1][j] + u[i][j - 1] - u[i - 1][j - 1];
            if ((u[i][j] == 0) != ((s[i][j - 1] - '0') == 0)) {
                assert(0);
            }
        }
    }
}

int main() {
    fin.sync_with_stdio(false); fin.tie(); fout.tie();
    fin >> n >> m;

    for (int i = 1; i <= n; ++ i)
        fin >> s[i];

    for (int i = 1; i <= n; ++ i) {
        s[i] = '0' + s[i] + '0';
    }

    s[0].resize(m + 2, '0');
    s[n + 1].resize(m + 2, '0');

    for (int i = 1; i <= n; ++ i) {
        st[i][0] = 1;
        for (int j = 1; j <= m; ++ j) {
            if (s[i][j] == '1')
                st[i][j] = st[i][j - 1];
            else
                st[i][j] = j + 1;
        }

        dr[i][m + 1] = m;
        for (int j = m; j > 0; -- j) {
            if (s[i][j] == '1')
                dr[i][j] = dr[i][j + 1];
            else
                dr[i][j] = j - 1;
        }
    }

    for (int i = 1; i <= n; ++ i)
        w[i] = inf;

    for (int i = 1; i <= n; ++ i) {
        for (int j = 1; j <= m; ++ j) {
            if (s[i - 1][j] == '0' && s[i][j] == '1') {
                int k = i;
                int mn = st[i][j], mx = dr[i][j];

                while (k <= m && s[k][j] == '1') {
                    mn = max(mn, st[k][j]);
                    mx = min(mx, dr[k][j]);
                    w[k - i + 1] = min(w[k - i + 1], mx - mn + 1);
                    ++ k;
                }
            }
        }

        for (int j = 1; j <= m; ++ j) {
            if (s[i + 1][j] == '0' && s[i][j] == '1') {
                int k = i;
                int mn = st[i][j], mx = dr[i][j];

                while (k > 0 && s[k][j] == '1') {
                    mn = max(mn, st[k][j]);
                    mx = min(mx, dr[k][j]);
                    w[i - k + 1] = min(w[i - k + 1], mx - mn + 1);
                    -- k;
                }
            }
        }
    }

    int h = inf;
    for (int j = 1; j <= m; ++ j) {
        int cnt = 0;
        for (int i = 1; i <= n; ++ i) {
            if (s[i][j] == '1')
                ++ cnt;
            else
                cnt = 0;

            if (s[i][j] == '1' && s[i + 1][j] == '0')
                h = min(h, cnt);
        }
    }

    int _w = inf;
    for (int i = 1; i <= n; ++ i) {
        int cnt = 0;
        for (int j = 1; j <= m; ++ j) {
            if (s[i][j] == '1')
                ++ cnt;
            else
                cnt = 0;

            if (s[i][j] == '1' && s[i][j + 1] == '0')
                _w = min(_w, cnt);
        }
    }

    int amax = 0;
    for (int i = 1; i <= h; ++ i) {
        if (w[i] != inf)
            amax = max(amax, i * min(w[i], _w));
    }

    cout << amax << "\n";

    return 0;
}

Compilation message (stderr)

bomb.cpp: In function 'void check(int, int)':
bomb.cpp:27:10: warning: unused variable 'ok' [-Wunused-variable]
     bool ok = 1;
          ^~
#Verdict Execution timeMemoryGrader output
Fetching results...