Submission #332239

#TimeUsernameProblemLanguageResultExecution timeMemory
332239vitkishloh228Bomb (IZhO17_bomb)C++14
30 / 100
1100 ms41472 KiB
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int solve1(int n, int m, vector<string> s) {
    vector<vector<int>> pr(n + 1, vector<int>(m + 1));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            int val = s[i][j] - '0';
            pr[i + 1][j + 1] = val + pr[i + 1][j] + pr[i][j + 1] - pr[i][j];
        }
    }
    int maxlen = n;
    for (int j = 0; j < m; ++j) {
        int L0 = 0;
        for (int i = 0; i < n; ++i) {
            if (s[i][j] == '1') {
                L0++;
            }
            else {
                if (L0) {
                    maxlen = min(maxlen, L0);
                }
                L0 = 0;
            }
        }
        if (L0) {
            maxlen = min(maxlen, L0);
        }
    }
    int tl = 0, tr = m + 100;
    while (tl < tr - 1) {
        int tm = (tl + tr) >> 1;
        //tm = 2;
        bool ok = true;
        vector<int> freeze(n);
        for (int j = 0; j < m; ++j) {
           
            if (!ok) break;
            for (int i = 0; i < n; ++i) {
                if (s[i][j] == '1') {
                    if (i + maxlen <= n && j + tm <= m) {
                        int S = pr[i + maxlen][j + tm] + pr[i][j] - pr[i + maxlen][j] - pr[i][j + tm];
                        if (S != (maxlen * tm) && !freeze[i]) {
              //              cout << i << ' ' << j << ' '<<tm << endl;
                            ok = false;
                            break;
                        }
                        if (S == (maxlen * tm)) {
                            for (int k = i; k < i + maxlen; ++k) {
                                freeze[k] = tm;
                            }
                            //i += maxlen - 1;
                            //continue;
                        }
                    }
                    else if (!freeze[i]) {
                //        cout << i << ' ' << j << ' ' << tm << endl;
                        ok = 0;
                        break;
                    }

                    freeze[i]--;
                }

            }
        }
        if (ok) {
            //cout << "YES";
            tl = tm;
        }
        else tr = tm;
    }
    return (maxlen * tl);
}
int main() {
    int n, m;
    cin >> n >> m;
    vector<string> s(n);
    for (int i = 0; i < n; ++i) cin >> s[i];
    cout << solve1(n, m, s);
}
#Verdict Execution timeMemoryGrader output
Fetching results...