# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
474291 | ogibogi2004 | Bomb (IZhO17_bomb) | C++14 | 468 ms | 56972 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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<<-1<<endl;
return 0;
}
int ans1=0;
for(int i=1;i<=maxw;i++)
{
if(i!=1)ans[i]=min(ans[i],i*(ans[i-1]/(i-1)));
//cout<<ans[i]<<" ";
ans1=max(ans1,ans[i]);
}
//cout<<endl;
cout<<ans1<<endl;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |