제출 #1292993

#제출 시각아이디문제언어결과실행 시간메모리
1292993fairkrashThe Kingdom of JOIOI (JOI17_joioi)C++20
60 / 100
4094 ms30096 KiB
#include <bits/stdc++.h> #include <random> using namespace std; using ll = long long; using ld = long double; ll INF = 1e18; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); ll n, m; cin >> n >> m; vector<vector<ll>> s(n, vector<ll>(m)); for (ll i = 0; i < n; i++) { for (ll j = 0; j < m; j++) { cin >> s[i][j]; } } ll ans = INF; { vector<ll> z(m); ll mx1 = 0; ll mn1 = INF; ll e1, e2; ll l = 0, r = 2e9; while (r - l > 1) { ll mid = (r + l) / 2; for (ll i = 0; i < m; i++) { z[i] = 0; } for (ll i = 0; i < m; i++) { for (ll j = 0; j < n; j++) { if (s[j][i] <= mid) { z[i] = j + 1; } } } for (ll i = m - 2; i >= 0; i--) { z[i] = max(z[i + 1], z[i]); } mx1 = -INF; mn1 = INF; for (ll i = 0; i < m; i++) { for (ll j = 0; j < z[i]; j++) { mn1 = min(mn1, s[j][i]); mx1 = max(mx1, s[j][i]); } } e1 = mx1 - mn1; for (ll i = 0; i < m; i++) { z[i] = 0; } for (ll i = 0; i < m; i++) { for (ll j = 0; j < n; j++) { if (s[j][i] <= mid) { z[i] = j + 1; } } } for (ll i = 1; i < m; i++) { z[i] = max(z[i - 1], z[i]); } mx1 = -INF; mn1 = INF; for (ll i = 0; i < m; i++) { for (ll j = 0; j < z[i]; j++) { mn1 = min(mn1, s[j][i]); mx1 = max(mx1, s[j][i]); } } e2 = mx1 - mn1; if (e1 < e2) { for (ll i = 0; i < m; i++) { z[i] = 0; } for (ll i = 0; i < m; i++) { for (ll j = 0; j < n; j++) { if (s[j][i] <= mid) { z[i] = j + 1; } } } for (ll i = m - 2; i >= 0; i--) { z[i] = max(z[i + 1], z[i]); } ll mx2 = -INF; ll mn2 = INF; for (ll i = 0; i < m; i++) { for (ll j = z[i]; j < n; j++) { mx2 = max(mx2, s[j][i]); mn2 = min(mn2, s[j][i]); } } ll d1 = mx2 - mn2; ans = min(ans, max(d1, e1)); if (d1 > e1) { l = mid; } else { r = mid; } } else { for (ll i = 0; i < m; i++) { z[i] = 0; } for (ll i = 0; i < m; i++) { for (ll j = 0; j < n; j++) { if (s[j][i] <= mid) { z[i] = j + 1; } } } for (ll i = 1; i < m; i++) { z[i] = max(z[i - 1], z[i]); } ll mx2 = -INF; ll mn2 = INF; for (ll i = 0; i < m; i++) { for (ll j = z[i]; j < n; j++) { mx2 = max(mx2, s[j][i]); mn2 = min(mn2, s[j][i]); } } ll d1 = mx2 - mn2; ans = min(ans, max(d1, e2)); if (d1 > e2) { l = mid; } else { r = mid; } } } } for (ll i = 0; i < n / 2; i++) { swap(s[i], s[n - 1 - i]); } { vector<ll> z(m); ll mx1 = 0; ll mn1 = INF; ll e1, e2; ll l = 0, r = 2e9; while (r - l > 1) { ll mid = (r + l) / 2; for (ll i = 0; i < m; i++) { z[i] = 0; } for (ll i = 0; i < m; i++) { for (ll j = 0; j < n; j++) { if (s[j][i] <= mid) { z[i] = j + 1; } } } for (ll i = m - 2; i >= 0; i--) { z[i] = max(z[i + 1], z[i]); } mx1 = -INF; mn1 = INF; for (ll i = 0; i < m; i++) { for (ll j = 0; j < z[i]; j++) { mn1 = min(mn1, s[j][i]); mx1 = max(mx1, s[j][i]); } } e1 = mx1 - mn1; for (ll i = 0; i < m; i++) { z[i] = 0; } for (ll i = 0; i < m; i++) { for (ll j = 0; j < n; j++) { if (s[j][i] <= mid) { z[i] = j + 1; } } } for (ll i = 1; i < m; i++) { z[i] = max(z[i - 1], z[i]); } mx1 = -INF; mn1 = INF; for (ll i = 0; i < m; i++) { for (ll j = 0; j < z[i]; j++) { mn1 = min(mn1, s[j][i]); mx1 = max(mx1, s[j][i]); } } e2 = mx1 - mn1; if (e1 < e2) { for (ll i = 0; i < m; i++) { z[i] = 0; } for (ll i = 0; i < m; i++) { for (ll j = 0; j < n; j++) { if (s[j][i] <= mid) { z[i] = j + 1; } } } for (ll i = m - 2; i >= 0; i--) { z[i] = max(z[i + 1], z[i]); } ll mx2 = -INF; ll mn2 = INF; for (ll i = 0; i < m; i++) { for (ll j = z[i]; j < n; j++) { mx2 = max(mx2, s[j][i]); mn2 = min(mn2, s[j][i]); } } ll d1 = mx2 - mn2; ans = min(ans, max(d1, e1)); if (d1 > e1) { l = mid; } else { r = mid; } } else { for (ll i = 0; i < m; i++) { z[i] = 0; } for (ll i = 0; i < m; i++) { for (ll j = 0; j < n; j++) { if (s[j][i] <= mid) { z[i] = j + 1; } } } for (ll i = 1; i < m; i++) { z[i] = max(z[i - 1], z[i]); } ll mx2 = -INF; ll mn2 = INF; for (ll i = 0; i < m; i++) { for (ll j = z[i]; j < n; j++) { mx2 = max(mx2, s[j][i]); mn2 = min(mn2, s[j][i]); } } ll d1 = mx2 - mn2; ans = min(ans, max(d1, e2)); if (d1 > e2) { l = mid; } else { r = mid; } } } } cout << ans; } //1 3 //100 100 3
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...