1. 程式人生 > >bzoj5085: 最大

bzoj5085: 最大

a.out span mil lse code memset ios cst 暴力

暴力是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: 最大