Submission #885647

#TimeUsernameProblemLanguageResultExecution timeMemory
885647alexddBomb (IZhO17_bomb)C++17
45 / 100
1093 ms58204 KiB
#include<iostream> using namespace std; int n,m; char mat[2505][2505]; int sump[2505][2505]; int mars[2505][2505]; int pver[2505][2505]; bool verif(int cntx, int cnty) { if(pver[cntx][cnty]!=0) { if(pver[cntx][cnty]==-1) return 0; else return 1; } 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]++; } 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') { pver[cntx][cnty]=-1; return 0; } } } pver[cntx][cnty]=1; return 1; } void solve_n3_y(int minx, int miny) { int poz=0, mxm=0; for(int i=minx;i>0;i--) { if(i*miny <= mxm) break; poz = max(poz, (mxm-1)/i+1); while(poz+1<=miny && verif(i,poz+1)) { poz++; } if(verif(i,poz)) mxm = max(mxm, i*poz); } cout<<mxm; } void solve_n3_x(int minx, int miny) { int poz=0, mxm=0; for(int i=miny;i>0;i--) { if(i*minx <= mxm) break; poz = max(poz, (mxm-1)/i+1); while(poz+1<=minx && verif(poz+1,i)) { poz++; } if(verif(poz,i)) mxm = max(mxm, i*poz); } cout<<mxm; } int calcmax_x(int i, int st, int dr) { int mij,ans=0; while(st<=dr) { mij=(st+dr)/2; if(verif(mij,i)) { ans = max(ans, mij); st=mij+1; } else { dr=mij-1; } } return ans; } int solve_bulaneala(int minx, int miny) { return 0; int mxm=0,prec=1; for(int i=miny;i>max(0,miny-3);i--) { if(i*minx <= mxm) break; int st,dr,mij,ans=0; st=max(prec, (mxm-1)/i+1); dr=minx; mxm = max(mxm, i*calcmax_x(i,st,dr)); prec=ans; } prec=1; for(int i=minx;i>0;i--) { if(i*miny <= mxm) break; int st,dr,mij,ans=0; st=max(prec, (mxm-1)/i+1); dr=miny; while(st<=dr) { mij=(st+dr)/2; if(verif(i,mij)) { ans = max(ans, mij); st=mij+1; } else { dr=mij-1; } } mxm = max(mxm, i*ans); prec=ans; } return mxm; } int solve_cautare_ternara(int minx, int miny) { int st,dr; st=1; dr=miny; while(dr-st+1>=3) { int mij1 = st + (dr-st+1)/3; int mij2 = mij1 + (dr-st+1)/3; if(calcmax_x(mij1,1,minx)*mij1 > calcmax_x(mij2,1,minx)*mij2) { dr=mij2; } else { st=mij1; } } int mxm=0; for(int i=st;i<=dr;i++) mxm = max(mxm, calcmax_x(i,1,minx)*i); return mxm; } 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 <= 170000000) { solve_n3_y(minx,miny); return 0; } else if(1LL*minx*n*m <= 170000000) { solve_n3_x(minx,miny); return 0; } else if(1) { cout<<max(solve_bulaneala(minx,miny), solve_cautare_ternara(minx,miny)); return 0; } else { cout<<minx*miny; return 0; } return 0; }

Compilation message (stderr)

bomb.cpp: In function 'int solve_bulaneala(int, int)':
bomb.cpp:100:19: warning: unused variable 'mij' [-Wunused-variable]
  100 |         int st,dr,mij,ans=0;
      |                   ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...