Submission #837255

#TimeUsernameProblemLanguageResultExecution timeMemory
837255LiudasThe Kingdom of JOIOI (JOI17_joioi)C++17
100 / 100
1772 ms16024 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> grid;
void reverse_rows(){
    for(auto &i : grid){
        reverse(i.begin(), i.end());
    }
}
void reverse_cols(){
    reverse(grid.begin(), grid.end());
}
int good(int mini, int K){
    int H = grid.size();
    int W = grid[0].size();
    int can_go = W;
    int mind = 1e9, maxd = 0;
    for(int i = 0; i < H; i ++){
        for(int j = 0; j < can_go; j ++){
            if(mini + K < grid[i][j])can_go = j;
        }
        for(int j = can_go; j < W; j ++){
            maxd = max(grid[i][j], maxd);
            mind = min(grid[i][j], mind);
        }
    }
    return maxd-mind;
}
int check(int K, int mini){
    int pass = 0;
    reverse_rows();
    pass |= (good(mini, K) <= K);
    reverse_cols();
    pass |= (good(mini, K) <= K);
    reverse_rows();
    pass |= (good(mini, K) <= K);
    reverse_cols();
    pass |= (good(mini, K) <= K);
    return pass;
}
int main(){
    int H, W;
    cin >> H >> W;
    int mini = 1e9;
    grid.assign(H, vector<int>(W));
    for(int i = 0; i < H; i ++){
        for(int j = 0; j < W; j ++){
            cin >> grid[i][j];
            mini = min(grid[i][j], mini);
        }
    }
    int L = 0, R = 1e9;
    while(L < R){
        int mid = (L + R) / 2;
        int t = check(mid, mini);
        if(t){
            R = mid;
        }
        else{
            L = mid + 1;
        }
    }
    cout << L << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...