Submission #1347638

#TimeUsernameProblemLanguageResultExecution timeMemory
1347638vladmart09The Kingdom of JOIOI (JOI17_joioi)C++20
100 / 100
1850 ms119048 KiB

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <random>
#include <queue>
#include <numeric>
#include <array>
#include <iomanip>
#include <stack>
#include <chrono>
#include <climits>

using namespace std;

using ll = int;
using ld = long double;
using vi = vector<ll>;
using vii = vector<vi>;
using viii = vector<vii>;
using pi = pair<ll, ll>;
using vpi = vector<pi>;
using vb = vector<bool>;
using vs = vector<string>;

#define vec vector
#define cmax(x, y) x = max({x, y})
#define cmin(x, y) x = min({x, y})
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()

const ll N = 1e3 + 5, MOD = 1e9 + 7, INF = (ll)1e18, K = 20;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

void rotate(vii& a) {
	ll n = a.size();
	ll m = a[0].size();

	vii b(m, vi(n));

	for (ll i = 0; i < n; i++) {
		for (ll j = 0; j < m; j++) {
			b[j][n - i - 1] = a[i][j];
		}
	}

	a = b;
}

ll check(vii& a) {
	ll n = a.size();
	ll m = a[0].size();

	vector<array<ll, 3>> b;

	for (ll i = 0; i < n; i++) {
		for (ll j = 0; j < m; j++) {
			b.push_back({ a[i][j], i + 1, j + 1 });
		}
	}

	sort(all(b));

	vii pref(n + 1, vi(m + 1));

	for (ll i = 1; i <= n; i++) {
		for (ll j = 1; j <= m; j++) {
			pref[i][j] = max({a[i - 1][j - 1], pref[i - 1][j], pref[i][j - 1]});
		}
	}

	ll mx = b.back()[0];
	ll mn = b[0][0];
	ll mx2 = b[0][0];

	ll ans = INT_MAX;
	
	for (auto& [val, x, y] : b) {
		cmin(ans, max(mx - val, mx2 - mn));

		cmax(mx2, pref[x][y]);
	}

	return ans;
}

void solve() {
	ll n, m; cin >> n >> m;

	vii a(n, vi(m));
	for (auto& x : a) {
		for (auto& y : x) cin >> y;
	}

	ll ans = INT_MAX;
	cmin(ans, check(a));

	rotate(a);
	cmin(ans, check(a));

	rotate(a);
	cmin(ans, check(a));

	rotate(a);
	cmin(ans, check(a));

	cout << ans << '\n';
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);

	long long tt = 1;
	//cin >> tt;

	while (tt--) {
		solve();
		cout << '\n';
	}

	return 0;
}

/*



































Какие темы повторить:
1) мст
2) 2сат
3) точки артикуляции
4) ксор базис
5) эйлеровый цикл, путь
6) кмп
7) конвекс хулл
8) вафельное дерево
9) суфиксный массив
10) суффиксный автомат
11) ним

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...