Submission #764232

#TimeUsernameProblemLanguageResultExecution timeMemory
764232someoneBomb (IZhO17_bomb)C++14
20 / 100
218 ms131072 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2542, INF = 1e18 + 42;

vector<pair<int, int>> pos[N];
int n, m, val[N][N], occ[N], sz[N][N];

int F(int lig, int col) {
    if(sz[lig][col] < 0)
        return lig * m + col;
    return sz[lig][col] = F(sz[lig][col] / m, sz[lig][col] % m);
}

void U(int l1, int c1, int l2, int c2) {
    int a = F(l1, c1), b = F(l2, c2);
    if(a == b) return;
    occ[-sz[a / m][a % m]]--;
    occ[-sz[b / m][b % m]]--;
    sz[a / m][a % m] += sz[b / m][b % m];
    sz[b / m][b % m] = a;
    occ[-sz[a / m][a % m]]++;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> m;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++) {
            char c; cin >> c;
            val[i][j] = (int)(c - '0');
            sz[i][j] = -INF;
        }
    for(int i = 0; i < n; i++)
        for(int j = 1; j < m; j++)
            if(val[i][j] == 1)
                val[i][j] += val[i][j-1];

    int bound = INF;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++) {
            if(val[i][j] > 0 && val[i][j+1] == 0)
                bound = min(bound, val[i][j]);
            pos[val[i][j]].push_back({i, j});
        }
    if(bound == INF) {
        cout << "0\n";
        return 0;
    }

    int ans = 0;
    for(int i = N-1; i > 0; i--) {
        for(auto pii : pos[i]) {
            occ[1]++;
            int lig = pii.first,
                col = pii.second;
            sz[lig][col] = -1;
            if(0 < lig && val[lig-1][col] >= i && sz[lig-1][col] != -INF)
                U(lig, col, lig-1, col);
            if(lig < n-1 && val[lig+1][col] >= i && sz[lig+1][col] != -INF)
                U(lig, col, lig+1, col);
        }
        if(i <= bound) {
            int mini = 0;
            for(int j = N-1; j > 0; j--)
                if(occ[j])
                    mini = j;
            ans = max(ans, mini * i);
        }
    }
    cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...