Submission #1131298

#TimeUsernameProblemLanguageResultExecution timeMemory
1131298v2v2The Kingdom of JOIOI (JOI17_joioi)C++17
0 / 100
0 ms324 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define all(x) x.begin(), x.end() #define fastio ios::sync_with_stdio(0); cin.tie(0) #define mp make_pair #define int ll const int MAXN = 2e3 + 5; int a[MAXN][MAXN]; int h, w; int mini, maxi; bool check(int diff) { // minimum on left, maximum on right // left decreases int mx_col = w; bool good = true; for (int row = 1; row <= h && good; row++) { int col; for (col = 0; col < mx_col; col++) { if (a[row][col+1] > mini + diff) break; } mx_col = col; int mn = 1e9; for (col = col + 1; col <= w; col++) { mn = min(mn, a[row][col]); } if (mn < maxi - diff) good = false; } if (good) return true; // right decreases int mn_col = 0; good = true; for (int row = 1; row <= h && good; row++) { int col; for (col = w+1; col > mn_col; col--) { if (a[row][col-1] < maxi - diff) break; } mn_col = col; int mx = 0; for (col = col - 1; col > 0; col--) { mx = max(mx, a[row][col]); } if (mx > mini + diff) good = false; } if (good) return true; // maximum on left, minimum on right // left decreases mx_col = w; good = true; for (int row = 1; row <= h && good; row++) { int col; for (col = 0; col < mx_col; col++) { if (a[row][col+1] < maxi - diff) break; } mx_col = col; int mx = 0; for (col = col + 1; col <= w; col++) { mx = max(mx, a[row][col]); } if (mx > mini + diff) good = false; } if (good) return true; // right decreases mn_col = 0; good = true; for (int row = 1; row <= h && good; row++) { int col; for (col = w+1; col > mn_col; col--) { if (a[row][col-1] > mini + diff) break; } mn_col = col; int mn = 0; for (col = col - 1; col > 0; col--) { mn = min(mn, a[row][col]); } if (mn < maxi - diff) good = false; } return good; } signed main() { fastio; cin >> h >> w; mini = 1e9, maxi = 0; for (int i = 1; i <= h; i++) for (int j = 1; j <= w; j++) { cin >> a[i][j]; mini = min(mini, a[i][j]); maxi = max(maxi, a[i][j]); } int l = 0, r = 1e9; while (l < r) { int mid = (l + r) / 2; if (check(mid)) r = mid; else l = mid + 1; } cout << l << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...