bzoj5085: 最大

暴力是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\n",ans);
    return 0;
}

 

posted @ 2018-09-06 16:46  AKCqhzdy  阅读(211)  评论(0编辑  收藏  举报