Submission #1304536

#TimeUsernameProblemLanguageResultExecution timeMemory
1304536sqwiijqkThe Kingdom of JOIOI (JOI17_joioi)C++20
0 / 100
1 ms580 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;
# define int long long
const int MOD = 1e9 + 7;
const int INF = 1e18;

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();
    }
}

int dist(int a, int b) {
    return abs(a - b);
}

int get(vector<vector<int>> &a, vector<vector<int>> &color, int c) {
    int mn = INF, mx = -INF;
    for (int i = 0; i < a.size(); i++) {
        for (int j = 0; j < a[i].size(); j++) {
            if (color[i][j] == c) {
                mn = min(mn, a[i][j]);
                mx = max(mx, a[i][j]);
            }
        }
    }
    return mx - mn;
}

bool check(int n, int m, vector<vector<int>> &a, int x) {
    {
        int mn = a[0][0];
        int mx = a[0][0];
        vector<vector<int>> color(n, vector<int>(m, 2));
        color[0][0] = 1;
        int mn_i;
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                for (int j = 1; j < m; j++) {
                    if (mn > a[i][j]) {
                        if (dist(mx, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mn = a[i][j];
                    } else if (mx < a[i][j]) {
                        if (dist(mn, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mx = a[i][j];
                    }
                    color[i][j] = 1;
                    mn_i = j;
                }
            } else {
                int now = 0;
                for (int j = 0; j <= mn_i; j++) {
                    if (mn > a[i][j]) {
                        if (dist(mx, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mn = a[i][j];
                    } else if (mx < a[i][j]) {
                        if (dist(mn, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mx = a[i][j];
                    }
                    color[i][j] = 1;
                    now = j;
                }
                mn_i = now;
            }
        }
        int f = get(a, color, 1);
        int s = get(a, color, 2);
        if (max(f, s) <= x) return 1;
    }
    {
        int mn = a[n - 1][0];
        int mx = a[n - 1][0];
        vector<vector<int>> color(n, vector<int>(m, 2));
        color[n - 1][0] = 1;
        int mn_i = 0;
        for (int i = n - 1; i >= 0; i--) {
            if (i == n - 1) {
                for (int j = 1; j < m; j++) {
                    if (mn > a[i][j]) {
                        if (dist(mx, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mn = a[i][j];
                    } else if (mx < a[i][j]) {
                        if (dist(mn, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mx = a[i][j];
                    }
                    color[i][j] = 1;
                    mn_i = j;
                }
            } else {
                int now = 0;
                for (int j = 0; j <= mn_i; j++) {
                    if (mn > a[i][j]) {
                        if (dist(mx, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mn = a[i][j];
                    } else if (mx < a[i][j]) {
                        if (dist(mn, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mx = a[i][j];
                    }
                    color[i][j] = 1;
                    now = j;
                }
                mn_i = now;
            }
        }
        int f = get(a, color, 1);
        int s = get(a, color, 2);
        if (max(f, s) <= x) return 1;
    }

    {
        int mn = a[n - 1][m - 1];
        int mx = a[n - 1][m - 1];
        vector<vector<int>> color(n, vector<int>(m, 2));
        color[n - 1][m - 1] = 1;
        int mn_i = m - 1;
        for (int i = n - 1; i >= 0; i--) {
            if (i == n - 1) {
                for (int j = m - 2; j >= 0; j--) {
                    if (mn > a[i][j]) {
                        if (dist(mx, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mn = a[i][j];
                    } else if (mx < a[i][j]) {
                        if (dist(mn, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mx = a[i][j];
                    }
                    color[i][j] = 1;
                    mn_i = j;
                }
            } else {
                int now = 0;
                for (int j = m - 1; j >= mn_i; j--) {
                    if (mn > a[i][j]) {
                        if (dist(mx, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mn = a[i][j];
                    } else if (mx < a[i][j]) {
                        if (dist(mn, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mx = a[i][j];
                    }
                    color[i][j] = 1;
                    now = j;
                }
                mn_i = now;
            }
        }
        int f = get(a, color, 1);
        int s = get(a, color, 2);
        if (max(f, s) <= x) return 1;
    }

    {
        int mn = a[0][m - 1];
        int mx = a[0][m - 1];
        vector<vector<int>> color(n, vector<int>(m, 2));
        color[0][m - 1] = 1;
        int mn_i = m - 1;
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                for (int j = m - 2; j >= 0; j--) {
                    if (mn > a[i][j]) {
                        if (dist(mx, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mn = a[i][j];
                    } else if (mx < a[i][j]) {
                        if (dist(mn, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mx = a[i][j];
                    }
                    color[i][j] = 1;
                    mn_i = j;
                }
            } else {
                int now = 0;
                for (int j = m - 1; j >= mn_i; j--) {
                    if (mn > a[i][j]) {
                        if (dist(mx, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mn = a[i][j];
                    } else if (mx < a[i][j]) {
                        if (dist(mn, a[i][j]) > x) {
                            break;
                        }
                        color[i][j] = 1;
                        mx = a[i][j];
                    }
                    color[i][j] = 1;
                    now = j;
                }
                mn_i = now;
            }
        }
        int f = get(a, color, 1);
        int s = get(a, color, 2);
        if (max(f, s) <= x) return 1;
    }

    return 0;
}

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];
        }
    }
    int l = -1, r = INF;
    while (r - l > 1) {
        int mid = (l + r) / 2;
        if (check(n, m, 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...