Submission #1197910

#TimeUsernameProblemLanguageResultExecution timeMemory
1197910rhombusThe Kingdom of JOIOI (JOI17_joioi)C++20
0 / 100
0 ms324 KiB
#include <bits/stdc++.h>

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

using namespace std;

typedef long long ll;

const int inf = 1e9 + 7;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, m;
    cin >> n >> m;
    vector a(n, vector (m, 0)); 
    int mx = 0, mn = inf;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> a[i][j];
            mn = min(mn, a[i][j]);
            mx = max(mx, a[i][j]);
        }
    }
    int l = 0, r = mx - mn, res = mx - mn;
    while (l <= r) {
        int mid = (l + r) / 2;
        int ub = mn + mid;
        int lb = mx - mid;
        vector c(n, vector (m, 0));
        vector <int> s(n, 0);
        bool bad = false;
        for (int i = 0; i < n; i++) {
            int prev = -1;
            int switches = 0;
            for (int j = 0; j < m; j++) {
                if (a[i][j] > ub && a[i][j] < lb) {
                    bad = true;
                    break;
                }
                if (a[i][j] > ub) {
                    c[i][j] = 2;
                } else if (a[i][j] < lb) {
                    c[i][j] = 1;
                }
                if (c[i][j] != 0) {
                    if (prev != -1 && c[i][j] != prev) {
                        switches++;
                    }
                    prev = c[i][j];
                }
            }
            if (bad) break;
            if (switches >= 2) {
                bad = true;
                break;
            }
            s[i] = switches;
        }
        bool bad1 = false, bad2 = false;
        {
            for (int i = 0; i < n; i++) {
                if (s[i] > 0) {
                    bool first = false;
                    for (int j = 0; j < m; j++) {
                        if (c[i][j] == 2 && !first) bad1 = true;
                        if (c[i][j] == 1) first = true;
                    }
                }
                for (int j = 0; j < m; j++) {
                    if (c[i][j] == 2) {
                        for (int k = j; k < m; k++) {
                            c[i][k] = 2;
                        }
                        break;
                    }
                }
                for (int j = m - 1; j >= 0; j--) {
                    if (c[i][j] == 1) {
                        for (int k = j; k >= 0; k--) {
                            c[i][k] = 1;
                        }
                        break;
                    }
                }
            }
            for (int j = 0; j < m; j++) {
                int prev = -1, switches = 0;
                for (int i = 0; i < n; i++) {
                    if (c[i][j] != 0) {
                        if (prev != -1 && c[i][j] != prev) {
                            switches++;
                        }
                        prev = c[i][j];
                    }
                }
                if (switches >= 2) {
                    bad1 = true;
                }
            }
        }
        {
            for (int i = 0; i < n; i++) {
                if (s[i] > 0) {
                    bool first = false;
                    for (int j = 0; j < m; j++) {
                        if (c[i][j] == 1 && !first) bad2 = true;
                        if (c[i][j] == 2) first = true;
                    }
                }
                for (int j = 0; j < m; j++) {
                    if (c[i][j] == 1) {
                        for (int k = j; k < m; k++) {
                            c[i][k] = 1;
                        }
                        break;
                    }
                }
                for (int j = m - 1; j >= 0; j--) {
                    if (c[i][j] == 2) {
                        for (int k = j; k >= 0; k--) {
                            c[i][k] = 2;
                        }
                        break;
                    }
                }
            }
            for (int j = 0; j < m; j++) {
                int prev = -1, switches = 0;
                for (int i = 0; i < n; i++) {
                    if (c[i][j] != 0) {
                        if (prev != -1 && c[i][j] != prev) {
                            switches++;
                        }
                        prev = c[i][j];
                    }
                }
                if (switches >= 2) {
                    bad2 = true;
                }
            }
        }
        bad |= (bad1 && bad2);
        if (bad) {
            l = mid + 1;
        } else {
            r = mid - 1;
            res = mid;
        }
    }
    cout << res << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...