暴力是4方的,开始我只3方(扫描的时候更新当前最大)
二分+暴力可以做到m^2logMAX
二分答案,暴力枚举可行的两个位置形成一段,对于段,最多只会有m^2种情况。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int n,m,a[1100][1100],bef[1100]; bool v[1100][1100]; bool check(int mid) { memset(v,false,sizeof(v)); for(int i=1;i<=n;i++) { int last=0; memset(bef,0,sizeof(bef)); for(int j=1;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=2147483647,mmax=0; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;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)/2; if(check(mid)) { ans=mid; l=mid+1; } else r=mid-1; } printf("%d ",ans); return 0; }