#include <bits/stdc++.h>
#include <experimental/random>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
void solve1();
using ll = long long;
using ull = unsigned long long;
using ld = double;
using BIG = __int128_t;
# define int long long
const int MOD = 1e9 + 7;
const int INF = 1e9;
signed main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int qwerty = 1;
// cin >> qwerty;
while (qwerty--) {
solve1();
}
}
int dist(int a, int b) {
return abs(a - b);
}
int get(vector<vector<int>> &a, vector<vector<int>> &color, int c) {
int mn = INF, mx = -INF;
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < a[i].size(); j++) {
if (color[i][j] == c) {
mn = min(mn, a[i][j]);
mx = max(mx, a[i][j]);
}
}
}
return mx - mn;
}
bool check(int n, int m, vector<vector<int>> &a, int x) {
int mn = a[0][0];
int mx = a[0][0];
vector<vector<int>> color(n, vector<int>(m, 2));
color[0][0] = 1;
int mn_i;
for (int i = 0; i < n; i++) {
if (i == 0) {
for (int j = 1; j < m; j++) {
if (mn > a[i][j]) {
if (dist(mx, a[i][j]) > x) {
break;
}
color[i][j] = 1;
mn = a[i][j];
} else if (mx < a[i][j]) {
if (dist(mn, a[i][j]) > x) {
break;
}
color[i][j] = 1;
mx = a[i][j];
}
color[i][j] = 1;
mn_i = j;
}
} else {
int now = 0;
for (int j = 0; j <= mn_i; j++) {
if (mn > a[i][j]) {
if (dist(mx, a[i][j]) > x) {
break;
}
color[i][j] = 1;
mn = a[i][j];
} else if (mx < a[i][j]) {
if (dist(mn, a[i][j]) > x) {
break;
}
color[i][j] = 1;
mx = a[i][j];
}
color[i][j] = 1;
now = j;
}
mn_i = now;
}
}
int f = get(a, color, 1);
int s = get(a, color, 2);
if (max(f, s) <= x) return 1;
mn = a[n - 1][0];
mx = a[n - 1][0];
color.assign(n, vector<int>(m, 2));
color[n - 1][0] = 1;
mn_i = 0;
for (int i = n - 1; i >= 0; i--) {
if (i == n - 1) {
for (int j = 1; j < m; j++) {
if (mn > a[i][j]) {
if (dist(mx, a[i][j]) > x) {
break;
}
color[i][j] = 1;
mn = a[i][j];
} else if (mx < a[i][j]) {
if (dist(mn, a[i][j]) > x) {
break;
}
color[i][j] = 1;
mx = a[i][j];
}
color[i][j] = 1;
mn_i = j;
}
} else {
int now = 0;
for (int j = 0; j <= mn_i; j++) {
if (mn > a[i][j]) {
if (dist(mx, a[i][j]) > x) {
break;
}
color[i][j] = 1;
mn = a[i][j];
} else if (mx < a[i][j]) {
if (dist(mn, a[i][j]) > x) {
break;
}
color[i][j] = 1;
mx = a[i][j];
}
color[i][j] = 1;
now = j;
}
mn_i = now;
}
}
f = get(a, color, 1);
s = get(a, color, 2);
if (max(f, s) <= x) return 1;
return 0;
}
void solve1() {
int n, m;
cin >> n >> m;
vector<vector<int>> a(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
int l = -1, r = INF;
while (r - l > 1) {
int mid = (l + r) / 2;
if (check(n, m, a, mid)) {
r = mid;
} else {
l = mid;
}
}
cout << r;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |