bzoj5085: 最大
阅读原文时间:2023年07月11日阅读:1

暴力是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 ;  

}