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...