Cod sursa(job #3368028)

Utilizator markymrkKemenes Mark markymrk Data 12 octombrie 2026 22:22:25
Problema BMatrix Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int Nmax = 2e2 + 5;
char arr[Nmax][Nmax];
int h[Nmax];
int l[Nmax], r[Nmax];
stack<int> stk;

void left(int n) {
    while (!stk.empty()) stk.pop();
    for (int i = 1; i <= n; ++i) {
        while (!stk.empty() && h[i] <= h[stk.top()]) stk.pop();

        if (stk.empty()) l[i] = 0;
        else {
            l[i] = stk.top();
        }
        stk.push(i);
    }
}


void right(int n) {
    while (!stk.empty()) stk.pop();
    for (int i = n; i >= 1; --i) {
        while (!stk.empty() && h[i] <= h[stk.top()]) stk.pop();
        if (stk.empty()) r[i] = n + 1;
        else {
            r[i] = stk.top();
        }
        stk.push(i);
    }
}


signed main() {
    int n, m; cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            cin >> arr[i][j];
        }
    }
    int ans = 0;
    for (int k = 1; k < n; ++k) {
        int max1 = 0;
        int max2 = 0;
        for (int i = 1; i <= k; ++i) {


            for (int j = 1; j <= m; ++j) {
                if (arr[i][j] == '1') {
                    h[j] = 0;
                }
                else {
                    h[j]++;
                }
            }

            left(m); right(m);

            for (int j = 1; j <= m; ++j) {
                max1 = max(max1, (h[j] * (r[j] - l[j] - 1)));
            }

        }

        for (int j = 1; j <= m; ++j) {
            h[j] = 0;
        }

        for (int i = k + 1; i <= n; ++i) {


            for (int j = 1; j <= m; ++j) {
                if (arr[i][j] == '1') {
                    h[j] = 0;
                }
                else {
                    h[j]++;
                }
            }

            left(m); right(m);

            for (int j = 1; j <= m; ++j) {
                max2 = max(max2, (h[j] * (r[j] - l[j] - 1)));
            }

        }

        for (int j = 1; j <= m; ++j) {
            h[j] = 0;
        }


        ans = max(ans, max1 + max2);

    }
    cout << ans << endl;

}