Submission #1131300

#TimeUsernameProblemLanguageResultExecution timeMemory
1131300v2v2The Kingdom of JOIOI (JOI17_joioi)C++17
100 / 100
510 ms32020 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) { vector<int> left_has_mx(h+1), left_has_mn(h+1), right_has_mx(h+1), right_has_mn(h+1); for (int i = 1; i <= h; i++) { int l = 0; while (l < w && a[i][l + 1] <= mini + diff) l++; left_has_mn[i] = l; l = 0; while (l < w && a[i][l + 1] >= maxi - diff) l++; left_has_mx[i] = l; int r = w+1; while (r > 1 && a[i][r - 1] <= mini + diff) r--; right_has_mn[i] = r; r = w+1; while (r > 1 && a[i][r - 1] >= maxi - diff) r--; right_has_mx[i] = r; } // left has max, decreasing l bool good = true; int mx_l = w; for (int i = 1; i <= h && good; i++) { mx_l = min(mx_l, left_has_mx[i]); int r = max(mx_l + 1, right_has_mn[i]); if (r > mx_l + 1) good = false; } if (good) return true; // left has min, decreasing l good = true; mx_l = w; for (int i = 1; i <= h && good; i++) { mx_l = min(mx_l, left_has_mn[i]); int r = max(mx_l + 1, right_has_mx[i]); if (r > mx_l + 1) good = false; } if (good) return true; // left has max, increasing r good = true; int mn_r = 1; for (int i = 1; i <= h && good; i++) { mn_r = max(mn_r, right_has_mn[i]); int l = min(mn_r - 1, left_has_mx[i]); if (l < mn_r - 1) good = false; } if (good) return true; // left has max, increasing r good = true; mn_r = 1; for (int i = 1; i <= h && good; i++) { mn_r = max(mn_r, right_has_mx[i]); int l = min(mn_r - 1, left_has_mn[i]); if (l < mn_r - 1) 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...