제출 #885318

#제출 시각아이디문제언어결과실행 시간메모리
885318alexddBomb (IZhO17_bomb)C++17
50 / 100
1089 ms55712 KiB
#include<iostream> using namespace std; int n,m; char mat[2505][2505]; int sump[2505][2505]; int mars[2505][2505]; bool verif(int cntx, int cnty) { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) mars[i][j]=0; for(int i=1;i+cntx-1<=n;i++) { for(int j=1;j+cnty-1<=m;j++) { if(sump[i+cntx-1][j+cnty-1] - sump[i+cntx-1][j-1] - sump[i-1][j+cnty-1] + sump[i-1][j-1] == cntx*cnty)///toate is 1 { mars[i][j]++; mars[i][j+cnty]--; mars[i+cntx][j]--; mars[i+cntx][j+cnty]++; } } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { mars[i][j] += mars[i-1][j] + mars[i][j-1] - mars[i-1][j-1]; if(mars[i][j]==0 && mat[i][j]=='1') return 0; } } return 1; } signed main() { cin>>n>>m; int minx=n,miny=m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>mat[i][j]; sump[i][j] = sump[i-1][j] + sump[i][j-1] - sump[i-1][j-1]; if(mat[i][j]=='1') sump[i][j]++; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(mat[i][j]=='1' && (j==m || mat[i][j+1]=='0')) { int cnt=0; for(int u=j;u>0;u--) { if(mat[i][u]=='0') break; cnt++; } miny = min(miny, cnt); } } } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(mat[j][i]=='1' && (j==n || mat[j+1][i]=='0')) { int cnt=0; for(int u=j;u>0;u--) { if(mat[u][i]=='0') break; cnt++; } minx = min(minx, cnt); } } } if(1LL*miny * n * m > 500000000) { cout<<minx*miny; return 0; } //minx=n;miny=m; int poz=0, mxm=0; for(int i=minx;i>0;i--) { if(i*miny <= mxm) break; while(poz+1<=miny && verif(i,poz+1)) { poz++; } mxm = max(mxm, i*poz); } cout<<mxm; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...