Submission #386385

#TimeUsernameProblemLanguageResultExecution timeMemory
386385ritul_kr_singhThe Kingdom of JOIOI (JOI17_joioi)C++17
100 / 100
1913 ms31816 KiB
// #pragma GCC optimize("Ofast,unroll-loops")
 
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define nl << '\n'
#define sp << ' ' <<
 
int h, w;
int g[2000][2000], a[2000], b[2000], maxElement, minElement;
 
bool possible(int diff){
	int res0 = 0, res1 = 0;
	for(int i=0; i<h; ++i){
		a[i] = 0;
		for(int j=0; j<w; ++j){
			if(g[i][j]-minElement<=diff) ++a[i];
			else break;
		}
		b[i] = a[i];
		a[i] = min(a[i], a[i-1]);
	}
	for(int i=h-2; i>=0; --i) b[i] = min(b[i], b[i+1]);
	for(int i=0; i<h; ++i){
		for(int j=a[i]; j<w; ++j)
			res0 = max(res0, maxElement - g[i][j]);
		for(int j=b[i]; j<w; ++j)
			res1 = max(res1, maxElement - g[i][j]);
	}
	return (res0<=diff or res1<=diff);
}
 
int search(){
	int res = maxElement - minElement;
	int low = 0, high = res;
	while(low<high){
		int mid = (low+high)/2;
		if(possible(mid)) high = mid;
		else low = mid+1;
	}
	if(!possible(low)) return res;
	return low;
}
 
void rotate(){
	int g0[h][w];
	for(int i=0; i<h; ++i)
		for(int j=0; j<w; ++j)
			g0[i][j] = g[i][j];
	swap(h, w);
	for(int i=0; i<h; ++i)
		for(int j=0; j<w; ++j)
			g[i][j] = g0[j][h-1-i];
}
 
signed main(){
	cin.tie(0)->sync_with_stdio(0);
 
	cin >> h >> w;
	for(int i=0; i<h; ++i)
		for(int j=0; j<w; ++j)
			cin >> g[i][j];
	int ans = 2e9;
 
 
	maxElement = minElement = g[0][0];
	for(int i=0; i<h; ++i)
		for(int j=0; j<w; ++j)
			maxElement = max(maxElement, g[i][j]), minElement = min(minElement, g[i][j]);
 
	for(int _=0; _<4; ++_){
		if(_) rotate();
		ans = min(ans, search());
	}
 
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...