# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
474288 | ogibogi2004 | Bomb (IZhO17_bomb) | C++14 | 472 ms | 56900 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2502;
char t[MAXN][MAXN];
int n,m,maxw,maxh;
vector<pair<int,int> >segments[MAXN];
vector<pair<int,int> >mws[MAXN];
int up[MAXN][MAXN];
int down[MAXN][MAXN];
int ans[MAXN];
int main()
{
cin>>n>>m;
maxh=n;
maxw=m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>t[i][j];
}
}
for(int i=1;i<=n;i++)
{
ans[i]=n*m;
int cnt=0;
for(int j=1;j<=m;j++)
{
ans[j]=n*m;
if(t[i][j]=='1')cnt++;
else
{
if(cnt>0)maxw=min(maxw,cnt);
cnt=0;
}
}
if(cnt>0)maxw=min(maxw,cnt);
}
//cout<<maxw<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(t[i][j]=='0')up[i][j]=-1;
else
{
if(up[i-1][j]>0)up[i][j]=up[i-1][j];
else up[i][j]=i;
}
}
}
for(int i=n;i>=1;i--)
{
for(int j=1;j<=m;j++)
{
if(t[i][j]=='0')down[i][j]=-1;
else
{
if(down[i+1][j]>0)down[i][j]=down[i+1][j];
else down[i][j]=i;
}
}
}
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=1;j<=m;j++)
{
if(t[i][j]=='0')
{
if(cnt>0)mws[i].push_back({j-cnt,j-1});
cnt=0;
}
else cnt++;
}
if(cnt>0)mws[i].push_back({m-cnt+1,m});
}
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<up[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<down[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;*/
for(int i=1;i<=n;i++)
{
//cout<<i<<":\n";
for(int j=0;j<mws[i].size();j++)
{
int start=mws[i][j].first;
int mindown=n+1,maxup=-1;
for(int len=1;start+len-1<=mws[i][j].second;len++)
{
mindown=min(mindown,down[i][start+len-1]);
maxup=max(maxup,up[i][start+len-1]);
//cout<<mws[i][j].first<<" "<<len<<" "<<mindown<<" "<<maxup<<endl;
//cout<<mindown<<" "<<maxup<<endl;
//cout<<mindown<<" "<<maxup<<endl;
ans[len]=min(ans[len],len*(mindown-maxup+1));
}
start=mws[i][j].second;
mindown=n+1;maxup=-1;
for(int len=1;start-len+1>=mws[i][j].first;len++)
{
mindown=min(mindown,down[i][start-len+1]);
maxup=max(maxup,up[i][start-len+1]);
//cout<<mws[i][j].second<<" "<<len<<" "<<mindown<<" "<<maxup<<endl;
ans[len]=min(ans[len],len*(mindown-maxup+1));
}
}
}
if(maxw==0)
{
cout<<0<<endl;
return 0;
}
int ans1=0;
for(int i=1;i<=maxw;i++)
{
//cout<<ans[i]<<" ";
ans1=max(ans1,ans[i]);
}
//cout<<endl;
cout<<ans1<<endl;
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |