Submission #907374

#TimeUsernameProblemLanguageResultExecution timeMemory
907374daoquanglinh2007Bomb (IZhO17_bomb)C++17
70 / 100
971 ms55960 KiB
#pragma GCC optimize("Ofast") #pragma GCC target("sse4") #include <bits/stdc++.h> using namespace std; const int NM = 2500, inf = 1e9+7; int N, M, f[NM+5][NM+5], dp[NM+5][NM+5], ans = 0, H = +inf, W = +inf; char a[NM+5][NM+5]; int getf(int x, int y, int u, int v){ return f[u][v]-f[x-1][v]-f[u][y-1]+f[x-1][y-1]; } bool check(int r, int c){ for (int i = 1; i <= N; i++) for (int j = 1; j <= M; j++) dp[i][j] = 0; for (int i = 1; i+r-1 <= N; i++) for (int j = 1; j+c-1 <= M; j++) if (getf(i, j, i+r-1, j+c-1) == r*c){ dp[i+r-1][j+c-1]++; dp[i+r-1][j-1]--; dp[i-1][j+c-1]--; dp[i-1][j-1]++; } for (int i = N; i >= 1; i--) for (int j = M; j >= 1; j--){ dp[i][j] += dp[i+1][j]+dp[i][j+1]-dp[i+1][j+1]; if (dp[i][j] == 0 && a[i][j] == '1') return 0; } return 1; } void preprocess(){ for (int j = 1; j <= M; j++) for (int i = 1; i <= N; i++){ if (a[i][j] == '0') continue; int k = i; while (k <= N && a[k][j] == '1') k++; H = min(H, k-i); i = k-1; } for (int i = 1; i <= N; i++) for (int j = 1; j <= M; j++){ if (a[i][j] == '0') continue; int k = j; while (k <= M && a[i][k] == '1') k++; W = min(W, k-j); j = k-1; } } int main(){ // freopen("BOMB.inp", "r", stdin); // freopen("BOMB.ans", "w", stdout); ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> M; for (int i = 1; i <= N; i++) for (int j = 1; j <= M; j++){ cin >> a[i][j]; if (a[i][j] == '1') f[i][j] = 1; } preprocess(); for (int i = 1; i <= N; i++) for (int j = 1; j <= M; j++) f[i][j] += f[i-1][j]+f[i][j-1]-f[i-1][j-1]; if (N <= 450 && M <= 450){ int j = W; for (int i = 1; i <= H; i++){ while (j > 0 && !check(i, j)) j--; ans = max(ans, i*j); } cout << ans; return 0; } int l = 1, r = W; while (l <= r){ int mid = (l+r)/2; if (check(H, mid)){ ans = max(ans, H*mid); l = mid+1; } else{ if (H-1 > 0 && check(H-1, mid)) ans = max(ans, (H-1)*mid); r = mid-1; } } l = 1, r = H; while (l <= r){ int mid = (l+r)/2; if (check(mid, W)){ ans = max(ans, mid*W); l = mid+1; } else r = mid-1; } int j = W-1; for (int i = 1; i < H; i++){ if (i*j <= ans) continue; while (j > 0 && !check(i, j)){ if ((double)clock()/CLOCKS_PER_SEC > 0.95) break; j--; } if ((double)clock()/CLOCKS_PER_SEC > 0.95) break; ans = max(ans, i*j); } cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...