0
点赞
收藏
分享

微信扫一扫

BZOJ 5085(最大-经典题)


Description

给你一个n×m的矩形,要你找一个子矩形,价值为左上角左下角右上角右下角这四个数的最小值,要你最大化矩形(这个矩形的行数和列数都大于1)
的价值。

Input

第一行两个数n,m,接下来n行每行m个数,用来描述矩形
n, m ≤ 1000

Output

输出一个数表示答案
Sample Input

2 2

1 2

3 4
Sample Output

1

从大到小枚举数,
显然答案的4个点在最大4*min(n,m)中。

#include<bits/stdc++.h> 
using namespace std;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma
#define
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int a[1020][1020],rk[1020][1020];
pair<int ,pi > v[1000*1000+10];
int main()
{
// freopen("bzoj5085.in","r",stdin);
// freopen(".out","w",stdout);
int n=read(),m=read();
int cnt=0;
For(i,n) For(j,m)a[i][j]=read(),v[++cnt]=mp(a[i][j],mp(i,j));
sort(v+1,v+1+cnt);
For(i,cnt) rk[v[i].se.fi][v[i].se.se]=i;
ForD(i,cnt) Fork(j,i+1,cnt){
int x=v[i].se.fi,y=v[i].se.se;
int xa=v[j].se.fi,ya=v[j].se.se;
if(x!=xa&&y!=ya && rk[x][ya]>i && rk[xa][y]>i) {
cout<<v[i].fi<<endl;return 0;
}
}


return 0;
}


举报

相关推荐

0 条评论