제출 #363984

#제출 시각아이디문제언어결과실행 시간메모리
363984NachoLibreThe Kingdom of JOIOI (JOI17_joioi)C++17
100 / 100
638 ms37524 KiB
#include <bits/stdc++.h>
using namespace std;
#undef wambule
#define wambule
#define sz(a) ((int)a.size())
typedef vector<int> vint;
#ifndef wambule
#include ".h"
#else
#endif

const int N = 2003, M = N;
int n, m, a[N][M], ox, on = 1e9, z;

void X() {
	for(int i = 0; i < n; ++i) {
		for(int j = 0; j < m / 2; ++j) {
			swap(a[i][j], a[i][m - 1 - j]);
		}
	}
}

void Y() {
	for(int i = 0; i < n / 2; ++i) {
		for(int j = 0; j < m; ++j) {
			swap(a[i][j], a[n - 1 - i][j]);
		}
	}
}

bool C(int x) {
	int y = m;
	for(int i = 0; i < n; ++i) {
		for(int j = 0; j < y; ++j) {
			if(ox - x > a[i][j]) {
				y = j;
				break;
			}
		}
		for(int j = y; j < m; ++j) {
			if(on + x < a[i][j]) {
				return 0;
			}
		}
	}
	return 1;
}

int D() {
	int l = 0, r = ox - on;
	while(l < r) {
		int m = (l + r) / 2;
		// cout << m << " " << C(m) << endl;
		if(m == 7) ++z;
		if(C(m)) {
			r = m;
		} else {
			l = m + 1;
		}
	}
	return l;
}

#ifdef wambule
mt19937 rnd(time(0));
int R(int l, int r) {
	return 1ll * rnd() % (r - l + 1) + l;
}

const int inf = 1e9 + 1;
int ffp;
void G(int i, int y, int lx = 0, int ln = inf, int rx = 0, int rn = inf) {
	if(i == n) {
		if(ln == inf || rn == inf) return;
		ffp = min(ffp, max(lx - ln, rx - rn));
		return;
	}
	for(int j = -1; j < y; ++j) {
		int nln = inf, nlx = 0, nrn = inf, nrx = 0;
		for(int jj = 0; jj <= j; ++jj) {
			nln = min(nln, a[i][jj]);
			nlx = max(nlx, a[i][jj]);
		}
		for(int jj = j + 1; jj < m; ++jj) {
			nrn = min(nrn, a[i][jj]);
			nrx = max(nrx, a[i][jj]);
		}
		G(i + 1, j + 1, max(nlx, lx), min(nln, ln), max(nrx, rx), min(nrn, rn));
	}
}

int V() {
	ffp = inf;
	G(0, m);
	Y();
	G(0, m);
	X();
	G(0, m);
	Y();
	G(0, m);
	X();
	return ffp;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int rtg = 1;
	if(rtg == 1) {
		cin >> n >> m;
		for(int i = 0; i < n; ++i) {
			for(int j = 0; j < m; ++j) {
				cin >> a[i][j];
				ox = max(ox, a[i][j]);
				on = min(on, a[i][j]);
			}
		}
		int fp = D();
		Y();
		fp = min(fp, D());
		X();
		fp = min(fp, D());
		Y();
		fp = min(fp, D());
		cout << fp << endl;
	} else if(rtg == 2) {
		n = m = 4;
		for(int i = 0; i < n; ++i) {
			for(int j = 0; j < m; ++j) {
				a[i][j] = R(0, 9);
				ox = max(ox, a[i][j]);
				on = min(on, a[i][j]);
			}
		}
		int fp = D();
		Y();
		fp = min(fp, D());
		X();
		fp = min(fp, D());
		Y();
		fp = min(fp, D());
		X();
		V();
		for(int i = 0; i < n; ++i) {
			for(int j = 0; j < m; ++j) {
				cout << a[i][j] << " ";
			}
			cout << endl;
		}
		cout << fp << " " << ffp << endl;
	}
	return 0;
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...