제출 #1365960

#제출 시각아이디문제언어결과실행 시간메모리
1365960nguyenkhangninh99The Kingdom of JOIOI (JOI17_joioi)C++20
100 / 100
265 ms157384 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 2e3 + 5;
int pre[maxn][maxn][2], suf[maxn][maxn][2], a[maxn][maxn];
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    
    int n, m; cin >> n >> m;

    int mn = 1e9, mx = -1e9;
    for(int i = 1; i <= n; i++){
        pre[i][0][0] = suf[i][m + 1][0] = 1e9;
        pre[i][0][1] = suf[i][m + 1][1] = -1e9;
        for(int j = 1; j <= m; j++){
            cin >> a[i][j];
            mn = min(mn, a[i][j]);
            mx = max(mx, a[i][j]);
            pre[i][j][0] = min(a[i][j], pre[i][j - 1][0]);
            pre[i][j][1] = max(a[i][j], pre[i][j - 1][1]);
        }
        for(int j = m; j >= 1; j--){
            suf[i][j][0] = min(a[i][j], suf[i][j + 1][0]);
            suf[i][j][1] = max(a[i][j], suf[i][j + 1][1]);
        }
    }
    
    auto ok = [&](int mid){
        int j1 = m, j2 = m , j3 = m, j4 = m, v1 = 1, v2 = 1, v3 = 1, v4 = 1;
        for(int i = 1; i <= n; i++){
            while(j1 && mx - pre[i][j1][0] > mid) j1--;
            v1 &= (suf[i][j1 + 1][1] - mn <= mid);
            while(j2 && pre[i][j2][1] - mn > mid) j2--;
            v2 &= (mx - suf[i][j2 + 1][0] <= mid);
        }
        for(int i = n; i >= 1; i--){
            while(j3 && mx - pre[i][j3][0] > mid) j3--;
            v3 &= (suf[i][j3 + 1][1] - mn <= mid);
            while(j4 && pre[i][j4][1] - mn > mid) j4--;
            v4 &= (mx - suf[i][j4 + 1][0] <= mid);
        }
        return v1 | v2 | v3 | v4;
    };

    int l = 0, r = mx - mn, res = mx - mn;
    while(l <= r){
        int mid = (l + r) / 2;
        if(ok(mid)) res = mid, r = mid - 1;
        else l = mid + 1;
    }
    cout << res;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…