Submission #1274867

#TimeUsernameProblemLanguageResultExecution timeMemory
1274867namhhThe Kingdom of JOIOI (JOI17_joioi)C++20
100 / 100
687 ms16268 KiB
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N = 2e3+5;
int m,n,a[N][N],mx,mn;
bool kaori1(int mid){
	int last = m;
	int emilia = mx-mid;
	int mn1 = 1e9;
	int mx1 = 0;
	for(int j = 1; j <= n; j++){
		for(int i = 1; i <= last; i++){
			if(a[i][j] < emilia){
				last = i-1;
				break;
			}
		}
		for(int i = last+1; i <= m; i++){
			mn1 = min(mn1,a[i][j]);
			mx1 = max(mx1,a[i][j]);
			if(mx1-mn1 > mid) return false;
		}
	}
	return true;
}
bool kaori2(int mid){
	int last = m;
	int emilia = mx-mid;
	int mn1 = 1e9;
	int mx1 = 0;
	for(int j = n; j >= 1; j--){
		for(int i = 1; i <= last; i++){
			if(a[i][j] < emilia){
				last = i-1;
				break;
			}
		}
		for(int i = last+1; i <= m; i++){
			mn1 = min(mn1,a[i][j]);
			mx1 = max(mx1,a[i][j]);
			if(mx1-mn1 > mid) return false;
		}
	}
	return true;
}
bool kaori3(int mid){
	int last = 1;
	int emilia = mx-mid;
	int mn1 = 1e9;
	int mx1 = 0;
	for(int j = 1; j <= n; j++){
		for(int i = m; i >= last; i--){
			if(a[i][j] < emilia){
				last = i+1;
				break;
			}
		}
		for(int i = last-1; i >= 1; i--){
			mn1 = min(mn1,a[i][j]);
			mx1 = max(mx1,a[i][j]);
			if(mx1-mn1 > mid) return false;
		}
	}
	return true;
}
bool kaori4(int mid){
	int last = 1;
	int emilia = mx-mid;
	int mn1 = 1e9;
	int mx1 = 0;
	for(int j = n; j >= 1; j--){
		for(int i = m; i >= last; i--){
			if(a[i][j] < emilia){
				last = i+1;
				break;
			}
		}
		for(int i = last-1; i >= 1; i--){
			mn1 = min(mn1,a[i][j]);
			mx1 = max(mx1,a[i][j]);
			if(mx1-mn1 > mid) return false;
		}
	}
	return true;
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> m >> n;
	mn = 1e9;
	mx = 0;
	for(int i = 1; i <= m; i++){
		for(int j = 1; j <= n; j++){
		    cin >> a[i][j];
		    mx = max(mx,a[i][j]);
		    mn = min(mn,a[i][j]);
	    }
	}
	int l = 0;
	int r = mx-mn;
	int ans = r;
	while(l <= r){
		int mid = (l+r)/2;
		if(kaori1(mid) || kaori2(mid) || kaori3(mid) || kaori4(mid)){
			ans = mid;
			r = mid-1;
		}
		else l = mid+1;
	}
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...