Submission #1199495

#TimeUsernameProblemLanguageResultExecution timeMemory
1199495efishelThe Kingdom of JOIOI (JOI17_joioi)C++20
60 / 100
4083 ms244468 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector <ll>;
using ii = pair <ll, ll>;
using vii = vector <ii>;
using lii = pair <ll, ii>;

const ll INF = ll(1E18)+16;

int main () {
    cin.tie(nullptr) -> sync_with_stdio(false);
    ll n, m;
    cin >> n >> m;
    vector <vll> mat(n, vll(m, 0));
    for (vll &ve : mat)
        for (ll &i : ve) cin >> i;
    auto fgetAns = [&]() {
        lii maxN = { 0, { -15, -15 } };
        for (ll i = 0; i < n; i++) {
            for (ll j = 0; j < m; j++) {
                maxN = max(maxN, { mat[i][j], { i, j } });
            }
        }
        vector <vll> minX(n, vll(m, INF));
        for (ll i = 0; i < n; i++) {
            for (ll j = 0; j < m; j++) {
                minX[i][j] = min((i == 0 ? INF : minX[i-1][j]), (j == 0 ? INF : minX[i][j-1]));
                minX[i][j] = min(minX[i][j], mat[i][j]);
                // cerr << mat[i][j] << ' ';
            }
            // cerr << '\n';
        }
        ll pans = INF;
        vector <lii> th, th2;
        vector <vector <char> > vis(n, vector <char> (m, false));
        for (ll i = 0; i < n; i++) {
            for (ll j = 0; j < m; j++) {
                th.push_back({ minX[i][j], { i, j } });
                th2.push_back({ mat[i][j], { i, j } });
            }
        }
        ll cl = 0, cr = n*m-1;
        ll base = minX[maxN.second.first][maxN.second.second];
        sort(th.rbegin(), th.rend());
        sort(th2.begin(), th2.end());
        for (auto [val, ppair] : th) {
            auto [i, j] = ppair;
            base = min(base, val);
            vis[i][j] = true;
            while (vis[th2[cr].second.first][th2[cr].second.second]) cr--;
            while (vis[th2[cl].second.first][th2[cl].second.second]) cl++;
            pans = min(pans, max(maxN.first - base, th2[cr].first - th2[cl].first));
            if (cl == cr) break;
        }
        return pans;
    };
    ll ans = INF;
    // cerr << fgetAns() << '\n';
    ans = min(ans, fgetAns());
    for (ll i = 0; i < n; i++) {
        for (ll j = 0; 2*j < m; j++) {
            swap(mat[i][j], mat[i][m-1-j]);
        }
    }
    // cerr << fgetAns() << '\n';
    ans = min(ans, fgetAns());
    for (ll i = 0; 2*i < n; i++) {
        for (ll j = 0; j < m; j++) {
            swap(mat[i][j], mat[n-1-i][j]);
        }
    }
    // cerr << fgetAns() << '\n';
    ans = min(ans, fgetAns());
    for (ll i = 0; i < n; i++) {
        for (ll j = 0; 2*j < m; j++) {
            swap(mat[i][j], mat[i][m-1-j]);
        }
    }
    // cerr << fgetAns() << '\n';
    ans = min(ans, fgetAns());
    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...