Submission #1305015

#TimeUsernameProblemLanguageResultExecution timeMemory
1305015sqwiijqkThe Kingdom of JOIOI (JOI17_joioi)C++20
100 / 100
2920 ms63388 KiB
#include <bits/stdc++.h>
#include <experimental/random>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

void solve1();

using ll = long long;
using ull = unsigned long long;
using ld = double;
using BIG = __int128_t;
const int MOD = 1e9 + 7;
const int INF = 1e9;

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int qwerty = 1;
    // cin >> qwerty;
    while (qwerty--) {
        solve1();
    }
}

void go_next(vector<vector<int>> &a) {
    int n = a.size();
    int m = a[0].size();
    vector<vector<int>> b(m, vector<int>(n));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            b[j][n - i - 1] = a[i][j];
        }
    }
    swap(a, b);
}

vector<vector<int>> qqq;

bool check(vector<vector<int>> &a, int x) {
    bool flag = false;
    for (int ZZZ = 0; ZZZ < 4; ZZZ++) {
        int n = a.size();
        int m = a[0].size();
        int mx = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                mx = max(mx, a[i][j]);
            }
        }
        vector<vector<int>> color(n, vector<int>(m, 2));
        int mn_i = m - 1;
        for (int i = 0; i < n; i++) {
            int now = -1;
            for (int j = 0; j <= mn_i; j++) {
                if (mx - a[i][j] > x) break;
                color[i][j] = 1;
                now = j;
            }
            mn_i = now;
        }
        int mn1 = INF, mx1 = 0, mn2 = INF, mx2 = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (color[i][j] == 1) {
                    mn1 = min(mn1, a[i][j]);
                    mx1 = max(mx1, a[i][j]);
                } else {
                    mn2 = min(mn2, a[i][j]);
                    mx2 = max(mx2, a[i][j]);
                }
            }
        }
        int fir = mx1 - mn1;
        int sec = mx2 - mn2;
        if (mx1 == INF) fir = 0;
        if (mx2 == INF) sec = 0;
        if (max(fir, sec) <= x) {
            flag = true;
            break;
        }
        go_next(a);
    }
    return flag;
}

void solve1() {
    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];
        }
    }
    qqq = a;
    int l = -1, r = 2 * INF;
    while (r - l > 1) {
        int mid = (l + r) / 2;
        a = qqq;
        if (check(a, mid)) {
            r = mid;
        } else {
            l = mid;
        }
    }
    cout << r;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...