Submission #1156233

#TimeUsernameProblemLanguageResultExecution timeMemory
1156233mochaThe Kingdom of JOIOI (JOI17_joioi)C++20
100 / 100
1229 ms31824 KiB
#include <bits/stdc++.h>
using namespace std;
const int mx = 2e3+5;
const int inf = 1e9+5;

int n, m;
int a[mx][mx];
int b[mx][mx];
int mn = inf, ma = 0;
int IOI, JOI;

bool check1(int x) {
    int pre = m;
    for (int i=1;i<=n;i++) {
        int mn = m+1;
        int ma = 0;
        for (int j=1;j<=m;j++) {
            if (abs(IOI-a[i][j]) > x) ma = max(ma, j);
            if (abs(JOI-a[i][j]) > x) mn = min(mn, j);
            if (abs(IOI-a[i][j]) > x and abs(JOI-a[i][j]) > x) return 0;
        }
        if (mn < ma or ma > pre) return 0;
        pre = min(pre, mn-1);
    }
    return true;
}

bool check2(int x) {
    int pre = m;
    for (int i=1;i<=n;i++) {
        int mn = m+1;
        int ma = 0;
        for (int j=1;j<=m;j++) {
            if (abs(IOI-b[i][j]) > x) ma = max(ma, j);
            if (abs(JOI-b[i][j]) > x) mn = min(mn, j);
            if (abs(IOI-a[i][j]) > x and abs(JOI-a[i][j]) > x) return 0;
        }
        if (mn < ma or ma > pre) return 0;
        pre = min(pre, mn-1);
    }
    return true;
}

signed main() {
    cin >> n >> m;
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            cin >> a[i][j];
            mn = min(mn, a[i][j]);
            ma = max(ma, a[i][j]);
            b[n-i+1][j] = a[i][j];
        }
    }
    IOI = ma;
    JOI = mn;
    int l = 0, r = ma - mn;
    while (l < r) {
        int m = l + r >> 1;
        if (check1(m) or check2(m)) {
            r = m;
        } else {
            l = m+1;
        }
    }
    int ans = l;
    {
        IOI = mn;
        JOI = ma;
        int l = 0, r = ma - mn;
        while (l < r) {
            int m = l + r >> 1;
            if (check1(m) or check2(m)) {
                r = m;
            } else {
                l = m+1;
            }
        }
        ans = min(ans, l);
    }
    cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...