Submission #1292984

#TimeUsernameProblemLanguageResultExecution timeMemory
1292984fairkrashThe Kingdom of JOIOI (JOI17_joioi)C++20
0 / 100
1 ms568 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 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; } } } ll vl = n; for (ll i = 0; i < m; i++) { if (z[i] != 0) { vl = i; break; } } ll vr = -1; for (ll i = m - 1; i >= 0; i--) { if (z[i] != 0) { vr = i; break; } } vr++; ll mx = 0; ll mn = INF; for (ll i = vl; i < vr; i++) { for (ll j = 0; j <= z[i]; j++) { mx = max(mx, s[j][i]); mn = min(mn, s[j][i]); } } ll d1 = mx - mn; ll mx1 = 0, mn1 = INF; for (ll i = 0; i < vl; i++) { for (ll j = 0; j < n; j++) { mx1 = max(mx1, s[j][i]); mn1 = min(mn1, s[j][i]); } } for (ll i = vr; i < m; i++) { for (ll j = 0; j < n; j++) { mx1 = max(mx1, s[j][i]); mn1 = min(mn1, s[j][i]); } } for (ll i = vl; i < vr; i++) { for (ll j = z[i] + 1; j < n; j++) { mx1 = max(mx1, s[j][i]); mn1 = min(mn1, s[j][i]); } } ll d2 = mx1 - mn1; ans = min(ans, max(d1, d2)); if (d1 < d2) { 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 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; } } } ll vl = n; for (ll i = 0; i < m; i++) { if (z[i] != 0) { vl = i; break; } } ll vr = -1; for (ll i = m - 1; i >= 0; i--) { if (z[i] != 0) { vr = i; break; } } vr++; ll mx = 0; ll mn = INF; for (ll i = vl; i < vr; i++) { for (ll j = 0; j <= z[i]; j++) { mx = max(mx, s[j][i]); mn = min(mn, s[j][i]); } } ll d1 = mx - mn; ll mx1 = 0, mn1 = INF; for (ll i = 0; i < vl; i++) { for (ll j = 0; j < n; j++) { mx1 = max(mx1, s[j][i]); mn1 = min(mn1, s[j][i]); } } for (ll i = vr; i < m; i++) { for (ll j = 0; j < n; j++) { mx1 = max(mx1, s[j][i]); mn1 = min(mn1, s[j][i]); } } for (ll i = vl; i < vr; i++) { for (ll j = z[i] + 1; j < n; j++) { mx1 = max(mx1, s[j][i]); mn1 = min(mn1, s[j][i]); } } ll d2 = mx1 - mn1; ans = min(ans, max(d1, d2)); if (d1 < d2) { l = mid; } else { r = mid; } } } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...