Cod sursa(job #2840623)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 28 ianuarie 2022 15:28:00
Problema BMatrix Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <bits/stdc++.h>

using namespace std;

inline void Open(const string Name) {
    #ifndef ONLINE_JUDGE
        (void)!freopen((Name + ".in").c_str(), "r", stdin);
        (void)!freopen((Name + ".out").c_str(), "w", stdout);
    #endif
}

char a[201][202], aux[202][202];

int up[201], down[201], l[201], r[201], dp[202];
int N, M;

void mxArea(int &ans) {
    stack <int> st;
 
    st.push(0);
    for(int i = 1;i <= M + 1;i++) {
        while(st.size() != 1 && dp[i] <= dp[st.top()]) {
            int top = st.top();
            st.pop();
            ans = max(ans, dp[top] * (i - st.top() - 1));
        }
        st.push(i);
    }
}

void RotateMatrix() {
    for(int i = 1;i <= N;i++)
        for(int j = 1;j <= M;j++)
            aux[j][N - i  + 1] = a[i][j];

    swap(N, M);
    memcpy(a, aux, sizeof(aux));
}

void solve(int Task) {
    memset(dp, 0, sizeof(dp));

    for(int i = 1;i <= N;i++) {
        for(int j = 1;j <= M;j++)
            dp[j] += (a[i][j] == '1'? -dp[j] : 1);

        if(Task == 4) {
            mxArea(up[i]);
            up[i] = max(up[i], up[i - 1]);
            continue;
        }

        if(Task == 3) {
            mxArea(l[i]);
            l[i] = max(l[i - 1], l[i]);
            continue;
        }

        if(Task == 2) {
            mxArea(down[i]);
            down[i] = max(down[i - 1], down[i]);
            continue;
        }

        mxArea(r[i]);
        r[i] = max(r[i - 1], r[i]);
    }
}

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

    Open("bmatrix");

    cin >> N >> M;
    for(int i = 1;i <= N;i++)
        cin >> (a[i] + 1);

    int T = 4;
    for(;T;T--) {
        solve(T);
        RotateMatrix();
    }

    int ans = 0;
    for(int i = 1;i <= N;i++) {
        ans = max(ans, up[i] + down[N - i]);
        cout << up[i] << " " << down[N - i] << "\n";
    }
    for(int i = 1;i <= M;i++)
        ans = max(ans, l[i] + r[M - i]);

    return 0;
}