제출 #973319

#제출 시각아이디문제언어결과실행 시간메모리
973319MilosMilutinovicBomb (IZhO17_bomb)C++14
0 / 100
1 ms604 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  assert(n == 1);
  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();
    }
  }
  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 <= m; i++) {
    res = min(res, mx[i] * i);
  }
  cout << res << '\n';
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...