제출 #110875

#제출 시각아이디문제언어결과실행 시간메모리
110875WLZThe Kingdom of JOIOI (JOI17_joioi)C++17
100 / 100
826 ms55168 KiB
#include <bits/stdc++.h>
using namespace std;

const int INF = 0x3f3f3f3f;

int n, m, mx = 0, mn = INF;
vector< vector<int> > a;

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

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

int check(int k) {
  int t = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (a[i][j] < mx - k) {
        t = max(t, j + 1);
      }
    }
    for (int j = 1; j < t; j++) {
      if (a[i][j] > mn + k) {
        return 0;
      }
    }
  }
  return 1;
}

int solve() {
  int lo = 0, hi = mx - mn;
  while (lo < hi) {
    int mid = (lo + hi) /  2;
    if (check(mid)) {
      hi = mid;
    } else {
      lo = mid + 1;
    }
  }
  return lo;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  a.assign(n + 1, vector<int>(m + 2, 0));
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cin >> a[i][j];
      mx = max(mx, a[i][j]);
      mn = min(mn, a[i][j]);
    }
  }
  int ans = solve();
  flip_h();
  ans = min(ans, solve());
  flip_v();
  ans = min(ans, solve());
  flip_h();
  ans = min(ans, solve());
  cout << ans << '\n';
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...