제출 #1230765

#제출 시각아이디문제언어결과실행 시간메모리
1230765Double_SlashBomb (IZhO17_bomb)C++20
6 / 100
9 ms16452 KiB
#include <bits/stdc++.h> using namespace std; int n, m, ps[2501][2501]; bool grid[2501][2501]; int main() { cin >> n >> m; assert(min(n, m) <= 1); for (int r = 0; r < n; ++r) { for (int c = 0; c < m; ++c) { char x; cin >> x; grid[r][c] = x == '1'; ps[r + 1][c + 1] = ps[r][c + 1] + ps[r + 1][c] - ps[r][c] + grid[r][c]; } } // cerr << n << ' ' << m << endl; // for (int r = 0; r < n; ++r) { // for (int c = 0; c < m; ++c) { // cerr << grid[r][c]; // } // cerr << endl; // } auto can = [&] (int R, int C) { if (not (R * C)) return true; for (int r = n; r--;) { for (int c = m; c--;) { if (not grid[r][c]) continue; // cerr << r << ' ' << c << endl; if (not grid[r + 1][c] and not grid[r][c + 1]) { if (r < R - 1 or c < C - 1) return false; if (ps[r + 1][c + 1] - ps[r - R + 1][c + 1] - ps[r + 1][c - C + 1] + ps[r - R + 1][c - C + 1] < R * C) { return false; } } else if (not grid[r + 1][c]) { if (r < R - 1) return false; if (ps[r + 1][c + 1] - ps[r + 1][c] - ps[r - R + 1][c + 1] + ps[r - R + 1][c] < R) { return false; } } else if (not grid[r][c + 1]) { if (c < C - 1) return false; if (ps[r + 1][c + 1] - ps[r][c + 1] - ps[r + 1][c - C + 1] + ps[r][c - C + 1] < C) { return false; } } } } return true; }; // cerr << can(3, 1); int ans = 0; for (int R = 1, C = m; R <= n; ++R) { while (not can(R, C)) --C; ans = max(ans, R * C); } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...