Submission #1347220

#TimeUsernameProblemLanguageResultExecution timeMemory
1347220kawhietThe Kingdom of JOIOI (JOI17_joioi)C++20
100 / 100
1749 ms47888 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...) 47
#endif

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    vector<vector<int>> a(n, vector<int>(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
        }
    }
    int mn = 1e9, mx = 0;
    for (int i = 0; i < n; i++) {
        mn = min(mn, ranges::min(a[i]));
        mx = max(mx, ranges::max(a[i]));
    }
    auto is = [&](vector<vector<int>> b) {
        vector<int> l(n), r(n);
        for (int i = 0; i < n; i++) {
            int j = 0;
            while (j < m && (b[i][j] & 1)) {
                l[i]++;
                r[i]++;
                j++;
            }
            j--;
            while (j >= 0 && b[i][j] == 3) {
                l[i]--;
                j--;
            }
            for (int j = r[i] + 1; j < m; j++) {
                if (b[i][j] == 1) return false;
            }
        }
        int cur = l[0];
        for (int i = 1; i < n; i++) {
            if (cur > r[i]) {
                return false;
            }
            if (l[i] > cur) {
                cur = l[i];
            }
        }
        return true;
    };
    auto good = [&](int k) {
        vector<vector<int>> b(n, vector<int>(m));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (a[i][j] - mn <= k) {
                    b[i][j] += 1;
                }
                if (mx - a[i][j] <= k) {
                    b[i][j] += 2;
                }
                if (b[i][j] == 0) {
                    return false;
                }
            }
        }
        if (is(b)) {
            return true;
        }
        ranges::reverse(b);
        if (is(b)) {
            return true;
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (b[i][j] == 1) {
                    b[i][j] = 2;
                } else if (b[i][j] == 2) {
                    b[i][j] = 1;
                }
            }
        }
        if (is(b)) {
            return true;
        }
        ranges::reverse(b);
        return is(b);
    };
    int l = -1, r = mx - mn;
    while (l + 1 < r) {
        int m = (l + r) / 2;
        if (good(m)) {
            r = m;
        } else {
            l = m;
        }
    }
    cout << r << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...