Submission #489113

#TimeUsernameProblemLanguageResultExecution timeMemory
489113cheissmartThe Kingdom of JOIOI (JOI17_joioi)C++14
100 / 100
2001 ms70840 KiB
#include <bits/stdc++.h>
#define IO_OP ios::sync_with_stdio(0), cin.tie(0)
#define F first
#define S second
#define V vector
#define PB push_back
#define EB emaplce_back
#define MP make_pair
#define ALL(v) (v).begin(), (v).end()

using namespace std;

typedef long long ll;
typedef pair<int, int> pi;
typedef vector<int> vi;

const int INF = 1e9 + 7, N = 2003;

int a[N][N];

signed main()
{
	IO_OP;

	int h, w;
	cin >> h >> w;
	int mx = 0, mn = INF;
	for(int i = 0; i < h; i++) {
		for(int j = 0; j < w; j++) {
			cin >> a[i][j];
			mx = max(mx, a[i][j]);
			mn = min(mn, a[i][j]);
		}
	}
	
	auto ok = [&] (int max_ans) {
		auto must_with_mx = [&] (int x) {
			return x - mn > max_ans;	
		};
		auto must_with_mn = [&] (int x) {
			return mx - x > max_ans;	
		};
		auto yes1 = [&]() {
			V<vi> b(h, vi(w));
			for(int i = 0; i < h; i++) 
				for(int j = 0; j < w; j++)
					if(must_with_mx(a[i][j]))
						b[i][j] = 1;
			for(int i = 0; i < h; i++)
				for(int j = w - 1; j >= 0; j--) {
					if(i + 1 < h) b[i + 1][j] |= b[i][j];
					if(j - 1 >= 0) b[i][j - 1] |= b[i][j];
					if(b[i][j] && must_with_mn(a[i][j]))
						return false;
				}
			return true;			
		};
		
		auto yes2 = [&]() {
			V<vi> b(h, vi(w));
			for(int i = 0; i < h; i++)
				for(int j = 0; j < w; j++)
					if(must_with_mx(a[i][j]))
						b[i][j] = 1;
			for(int i = h - 1; i >= 0; i--)
				for(int j = w - 1; j >= 0; j--) {
					if(i - 1 >= 0) b[i - 1][j] |= b[i][j];
					if(j - 1 >= 0) b[i][j - 1] |= b[i][j];
					if(b[i][j] && must_with_mn(a[i][j]))
						return false;
				}
			return true;			
		};
		auto yes3 = [&]() {
			V<vi> b(h, vi(w));
			for(int i = 0; i < h; i++) 
				for(int j = 0; j < w; j++)
					if(must_with_mn(a[i][j]))
						b[i][j] = 1;
			for(int i = 0; i < h; i++)
				for(int j = w - 1; j >= 0; j--) {
					if(i + 1 < h) b[i + 1][j] |= b[i][j];
					if(j - 1 >= 0) b[i][j - 1] |= b[i][j];
					if(b[i][j] && must_with_mx(a[i][j]))
						return false;
				}
			return true;			
		};
		
		auto yes4 = [&]() {
			V<vi> b(h, vi(w));
			for(int i = 0; i < h; i++)
				for(int j = 0; j < w; j++)
					if(must_with_mn(a[i][j]))
						b[i][j] = 1;
			for(int i = h - 1; i >= 0; i--)
				for(int j = w - 1; j >= 0; j--) {
					if(i - 1 >= 0) b[i - 1][j] |= b[i][j];
					if(j - 1 >= 0) b[i][j - 1] |= b[i][j];
					if(b[i][j] && must_with_mx(a[i][j]))
						return false;
				}
			return true;			
		};
		return yes1() || yes2() || yes3() || yes4();
	};
	
	int lb = 0, rb = mx - mn - 1;
	while(lb <= rb) {
		int mb = (lb + rb) / 2;
		if(ok(mb))
			rb = mb - 1;
		else
			lb = mb + 1;
	}
	cout << lb << '\n';
		
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...