Submission #1199436

#TimeUsernameProblemLanguageResultExecution timeMemory
1199436Saul0906The Kingdom of JOIOI (JOI17_joioi)C++20
60 / 100
4094 ms74752 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define rep(a,b,c) for(int a=b; a<c; a++)
#define repr(a,b,c) for(int a=b-1; a>c-1; a--)
#define repa(a,b) for(auto a:b)
#define mid ((l+r)>>1)
#define endl "\n"

using namespace std;

using vi = vector<int>;

const int N=2005, inf=1e9+5;

int h, w, g[N][N], pf[N][N][2][2], ans;

void solve(int x, int y, int a, int b, int mn, int mn2){
	int z;
	if(x==0) z=1;
	else z=-1;
	int mx=0, lst;
	if(y) lst=0;
	else lst=w;
	rep(i,0,h){
		int l=0, r=w-1;
		while(l<=r){
			if(!y){
				if(pf[x][mid][0][0]>=mn) l=mid+1;
				else r=mid-1;
			}else{
				if(pf[x][mid][1][0]>=mn) r=mid-1;
				else l=mid+1;
			}
		}
		if(!y){
			l=min(l,lst);
			r=l-1;
			if(x==a && b>=l) return;
			mx=max({mx,pf[x][r][0][1]-mn,pf[x][l][1][1]-mn2});
		}else{
			l=max(l,lst);
			r=l-1;
			if(x==a && b<=r) return;
			mx=max({mx,pf[x][l][1][1]-mn,pf[x][r][0][1]-mn2});
		}
		x+=z;
		lst=l;
	}
	ans=min(ans,mx);
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>h>>w;
	int mn=inf, mx=-inf, x, y;
	rep(i,0,h) rep(j,0,w){
		cin>>g[i][j];
		mn=min(mn,g[i][j]);
		mx=max(mx,g[i][j]);
	}
	ans=mx-mn;
	rep(i,0,h){
		x=inf;
		y=-inf;
		rep(j,0,w) x=min(x,g[i][j]), y=max(y,g[i][j]), pf[i][j][0][0]=x, pf[i][j][0][1]=y;
		x=inf;
		y=-inf;
		repr(j,w,0) x=min(x,g[i][j]), y=max(y,g[i][j]), pf[i][j][1][0]=x, pf[i][j][1][1]=y;
	}
	rep(i,0,h) rep(j,0,w){
		if(g[i][j]==mn) continue;
		solve(0,0,i,j,g[i][j],mn);
		solve(0,w-1,i,j,g[i][j],mn);
		solve(h-1,0,i,j,g[i][j],mn);
		solve(h-1,w-1,i,j,g[i][j],mn);
	}
	cout<<ans<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...