Submission #595059

#TimeUsernameProblemLanguageResultExecution timeMemory
595059piOOEThe Kingdom of JOIOI (JOI17_joioi)C++17
100 / 100
3366 ms58712 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 2001;

int a[N][N], n, m, mx, px, py;
bool t[N][N];

void upd() {
    mx = -1;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (mx < a[i][j]) {
                mx = a[i][j];
                px = i, py = j;
            }
        }
    }
}

void mirror() {
    for (int i = 0; i < n; ++i) {
        reverse(a[i], a[i] + m);
    }
    upd();
}

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> a[i][j];
        }
    }
    upd();
    auto check = [&](int mid) -> bool {
        for (int _ = 0; _ < 2; ++_) {
            for (int iter = 0; iter < 2; ++iter) {
                memset(t, 0, sizeof(t));
                int pos = m;
                for (int i = 0; i < n; ++i) {
                    for (int j = 0; j < pos; ++j) {
                        if (mx - a[i][j] <= mid) {
                            t[i][j] = true;
                        } else {
                            pos = j;
                            break;
                        }
                    }
                }
                int Max = -1, Min = mx;
                for (int i = 0; i < n; ++i) {
                    for (int j = 0; j < m; ++j) {
                        if (!t[i][j]) {
                            Max = max(a[i][j], Max);
                            Min = min(a[i][j], Min);
                        }
                    }
                }
                if (Max == -1 || Max - Min <= mid) {
                    return true;
                }
                rotate180();
            }
            mirror();
        }
        return false;
    };
    int l = -1, r = mx;
    while (l + 1 < r) {
        int mid = (l + r) >> 1;
        if (check(mid)) {
            r = mid;
        } else {
            l = mid;
        }
    }
    cout << r;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...