Submission #750009

#TimeUsernameProblemLanguageResultExecution timeMemory
750009PringThe Kingdom of JOIOI (JOI17_joioi)C++14
100 / 100
1306 ms102572 KiB
#include <bits/stdc++.h> using namespace std; #define int long long typedef pair<int, int> pii; const int MXN = 2005; int n, m, a[MXN][MXN], b[MXN][MXN]; bitset<MXN> lu[MXN]; pii C[MXN]; int big = 0, small = LLONG_MAX; int l, r; bool LU1() { for (int i = 0; i < n; i++) { lu[i].reset(); for (int j = 0; j < m; j++) { // if (i) lu[i][j] |= lu[i - 1][j]; // if (j) lu[i][j] |= lu[i][j - 1]; if (i && lu[i - 1][j]) lu[i][j] = true; if (j && lu[i][j - 1]) lu[i][j] = true; if (b[i][j] == 2) lu[i][j] = true; if (b[i][j] == 1 && lu[i][j]) return false; } } // for (int i = 0; i < n; i++) { // for (int j = 0; j < m; j++) cout << (lu[i][j] ? '1' : '0'); // cout << endl; // } // for (int i = 0; i < n; i++) { // for (int j = 0; j < m; j++) { // if (b[i][j] == 1 && lu[i][j]) return false; // } // } return true; } bool LU2() { for (int i = 0; i < n; i++) { lu[i].reset(); for (int j = 0; j < m; j++) { // if (i) lu[i][j] |= lu[i - 1][j]; // if (j) lu[i][j] |= lu[i][j - 1]; if (i && lu[i - 1][j]) lu[i][j] = true; if (j && lu[i][j - 1]) lu[i][j] = true; if (b[i][j] == 1) lu[i][j] = true; if (b[i][j] == 2 && lu[i][j]) return false; } } return true; } bool CHECK() { // for (int i = 0; i < n; i++) { // for (int j = 0; j < m; j++) { // cout << b[i][j] << ' '; // } // cout << endl; // } if (LU1()) return true; if (LU2()) return true; for (int i = 0; i < n; i++) { for (int j = 0; j < m / 2; j++) { swap(b[i][j], b[i][m - j - 1]); } } if (LU1()) return true; if (LU2()) return true; return false; } bool check(int x) { if (big - 2 * x < 1) { // cross for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i][j] < big - x) b[i][j] = 1; else if (x < a[i][j]) b[i][j] = 2; else b[i][j] = 0; } } } else { // not cross for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i][j] <= x) b[i][j] = 1; else if (big - x <= a[i][j]) b[i][j] = 2; else return false; } } } // cout << x << endl; bool f = CHECK(); // cout << (f ? "YES" : "NO") << endl; return f; } int32_t main() { cin.tie(0) -> sync_with_stdio(false); cin >> n >> m; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { cin >> a[i][j]; big = max(big, a[i][j]); small = min(small, a[i][j]); } for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) { a[i][j] -= small; } big -= small; int l = -1, r = big; while (l + 1 < r) { int mid = (l + r) >> 1; (check(mid) ? r : l) = mid; } cout << r << endl; // for (int i = 0; i < 4; i++) { // for (int j = 0; j < 4; j++) { // cin >> b[i][j]; // } // } // n = 4, m = 4; // cout << LU1() << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...