码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj5085: 最大

时间:2018-09-06 18:18:44      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:一段   int   pen   mes   ring   lib   暴力   freopen   pre   

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

 

bzoj5085: 最大

标签:一段   int   pen   mes   ring   lib   暴力   freopen   pre   

原文地址:https://www.cnblogs.com/AKCqhzdy/p/9599388.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!