Submission #973321

#TimeUsernameProblemLanguageResultExecution timeMemory
973321MilosMilutinovicBomb (IZhO17_bomb)C++14
4 / 100
139 ms81000 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; vector<string> s(n); for (int i = 0; i < n; i++) { cin >> s[i]; } vector<vector<int>> U(n, vector<int>(m)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (s[i][j] == '0') { continue; } U[i][j] = (i == 0 || s[i - 1][j] == '0' ? i : U[i - 1][j]); } } vector<vector<int>> D(n, vector<int>(m)); for (int i = n - 1; i >= 0; i--) { for (int j = 0; j < m; j++) { if (s[i][j] == '0') { continue; } D[i][j] = (i == n - 1 || s[i + 1][j] == '0' ? i : D[i + 1][j]); } } vector<vector<int>> len(n, vector<int>(m)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (s[i][j] == '0') { continue; } len[i][j] = D[i][j] - U[i][j] + 1; } } vector<int> mx(m + 1, n); for (int i = 0; i < n; i++) { vector<int> stk; for (int j = 0; j < m; j++) { if (s[i][j] == '0') { while (!stk.empty()) { int l = j - stk.back(); mx[l] = min(mx[l], len[i][stk.back()]); stk.pop_back(); } continue; } while (!stk.empty() && len[i][stk.back()] >= len[i][j]) { int l = j - stk.back() + 1; mx[l] = min(mx[l], len[i][j]); stk.pop_back(); } if (!stk.empty()) { int l = j - stk.back() + 1; mx[l] = min(mx[l], len[i][stk.back()]); } stk.push_back(j); } while (!stk.empty()) { int l = m - stk.back(); mx[l] = min(mx[l], len[i][stk.back()]); stk.pop_back(); } } for (int i = 0; i < n; i++) { vector<int> stk; for (int j = m - 1; j >= 0; j--) { if (s[i][j] == '0') { while (!stk.empty()) { int l = stk.back() - j; mx[l] = min(mx[l], len[i][stk.back()]); stk.pop_back(); } continue; } while (!stk.empty() && len[i][stk.back()] >= len[i][j]) { int l = stk.back() - j + 1; mx[l] = min(mx[l], len[i][j]); stk.pop_back(); } if (!stk.empty()) { int l = stk.back() - j + 1; mx[l] = min(mx[l], len[i][stk.back()]); } stk.push_back(j); } while (!stk.empty()) { int l = stk.back() + 1; mx[l] = min(mx[l], len[i][stk.back()]); stk.pop_back(); } } int width = m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (s[i][j] == '0') { continue; } int ptr = j; while (ptr + 1 < m && s[i][ptr + 1] == '0') { ptr += 1; } width = min(width, ptr - j + 1); j = ptr; } } for (int i = 1; i < m; i++) { mx[i + 1] = min(mx[i + 1], mx[i]); } int res = n * m; for (int i = 1; i <= width; i++) { res = min(res, mx[i] * i); } cout << res << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...