제출 #334693

#제출 시각아이디문제언어결과실행 시간메모리
334693limabeansBomb (IZhO17_bomb)C++17
100 / 100
445 ms76012 KiB
#include <bits/stdc++.h> using namespace std; template<typename T> void out(T x) { cout << x << endl; exit(0); } #define watch(x) cout << (#x) << " is " << (x) << endl const int maxn = 2555; const int inf = 1e9; int n,m; int a[maxn][maxn]; int up[maxn][maxn], dw[maxn][maxn]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; for (int i=0; i<n; i++) { string s; cin>>s; for (int j=0; j<m; j++) { a[i][j]=int(s[j]-'0'); } } for (int j=0; j<m; j++) { for (int i=0; i<n; i++) { if (a[i][j]==1) { up[i][j]=1; if (i>0) up[i][j]+=up[i-1][j]; } } for (int i=n-1; i>=0; i--) { if (a[i][j]==1) { dw[i][j]=1; dw[i][j]+=dw[i+1][j]; } } } int minW = inf; int minH = inf; for (int j=0; j<m; j++) { int cur = 0; for (int i=0; i<n; i++) { if (a[i][j]==1) { cur++; } else { if (cur>0) minH=min(minH,cur); cur=0; } } if (cur>0) minH=min(minH,cur); } for (int i=0; i<n; i++) { int cur = 0; for (int j=0; j<m; j++) { if (a[i][j]) { cur++; } else { if (cur>0) minW=min(minW,cur); cur=0; } } if (cur>0) minW=min(minW,cur); } // watch(minW); // watch(minH); vector<int> dp(maxn+10, minH); //dp[w]: given width w, what's feasible height h for rectangle hxw // left to right for (int i=0; i<n; i++) { int u=inf; int d=inf; int col=0; for (int j=0; j<m; j++) { if (a[i][j]==1) { u=min(u,up[i][j]); d=min(d,dw[i][j]); ++col; dp[col]=min(dp[col],u+d-1); } else { u=d=inf; col=0; } } } // right to left for (int i=0; i<n; i++) { int u=inf; int d=inf; int col=0; for (int j=m-1; j>=0; j--) { if (a[i][j]==1) { u=min(u,up[i][j]); d=min(d,dw[i][j]); ++col; dp[col]=min(dp[col],u+d-1); } else { u=d=inf; col=0; } } } int res = dp[1]; for (int i=2; i<=minW; i++) { dp[i]=min(dp[i],dp[i-1]); res=max(res,i*dp[i]); } cout<<res<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...