暴力是4方的,开始我只3方(扫描的时候更新当前最大)
二分+暴力可以做到m^2logMAX
二分答案,暴力枚举可行的两个位置形成一段,对于段,最多只会有m^2种情况。
#include
#include
#include
#include
#include
#include
using namespace std;
int n,m,a[][],bef[];
bool v[][];
bool check(int mid)
{
memset(v,false,sizeof(v));
for(int i=;i<=n;i++)
{
int last=;
memset(bef,,sizeof(bef));
for(int j=;j<=m;j++)
{
if(!(a[i][j]<mid))
{
for(int k=last;k;k=bef[k])
{
if(v[k][j])return true;
v[k][j]=true;
}
bef[j]=last;
last=j;
}
}
}
return false;
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
int mmin=,mmax=;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
scanf("%d",&a[i][j]);
mmax=max(mmax,a[i][j]);
mmin=min(mmin,a[i][j]);
}
int l=mmin,r=mmax,ans;
while(l<=r)
{
int mid=(l+r)/;
if(check(mid))
{
ans=mid;
l=mid+;
}
else r=mid-;
}
printf("%d\\n",ans);
return ;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章