제출 #1289768

#제출 시각아이디문제언어결과실행 시간메모리
1289768sqwiijqkThe Kingdom of JOIOI (JOI17_joioi)C++20
0 / 100
1 ms572 KiB
#include <bits/stdc++.h> #include <experimental/random> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; void solve1(); using ll = long long; using ull = unsigned long long; using ld = double; using BIG = __int128_t; # define int long long const int MOD = 1e9 + 7; const int INF = 1e9; signed main() { #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int qwerty = 1; // cin >> qwerty; while (qwerty--) { solve1(); } } int dist(int a, int b) { return abs(a - b); } int get(vector<vector<int>> &a, vector<vector<int>> &color, int c) { int mn = INF, mx = -INF; for (int i = 0; i < a.size(); i++) { for (int j = 0; j < a[i].size(); j++) { if (color[i][j] == c) { mn = min(mn, a[i][j]); mx = max(mx, a[i][j]); } } } return mx - mn; } bool check(int n, int m, vector<vector<int>> &a, int x) { int mn = a[0][0]; int mx = a[0][0]; vector<vector<int>> color(n, vector<int>(m, 2)); color[0][0] = 1; int mn_i; for (int i = 0; i < n; i++) { if (i == 0) { for (int j = 1; j < m; j++) { if (mn > a[i][j]) { if (dist(mx, a[i][j]) > x) { break; } color[i][j] = 1; mn = a[i][j]; } else if (mx < a[i][j]) { if (dist(mn, a[i][j]) > x) { break; } color[i][j] = 1; mx = a[i][j]; } color[i][j] = 1; mn_i = j; } } else { int now = 0; for (int j = 0; j <= mn_i; j++) { if (mn > a[i][j]) { if (dist(mx, a[i][j]) > x) { break; } color[i][j] = 1; mn = a[i][j]; } else if (mx < a[i][j]) { if (dist(mn, a[i][j]) > x) { break; } color[i][j] = 1; mx = a[i][j]; } color[i][j] = 1; now = j; } mn_i = now; } } int f = get(a, color, 1); int s = get(a, color, 2); if (max(f, s) <= x) return 1; mn = a[n - 1][0]; mx = a[n - 1][0]; color.assign(n, vector<int>(m, 2)); color[n - 1][0] = 1; mn_i = 0; for (int i = n - 1; i >= 0; i--) { if (i == n - 1) { for (int j = 1; j < m; j++) { if (mn > a[i][j]) { if (dist(mx, a[i][j]) > x) { break; } color[i][j] = 1; mn = a[i][j]; } else if (mx < a[i][j]) { if (dist(mn, a[i][j]) > x) { break; } color[i][j] = 1; mx = a[i][j]; } color[i][j] = 1; mn_i = j; } } else { int now = 0; for (int j = 0; j <= mn_i; j++) { if (mn > a[i][j]) { if (dist(mx, a[i][j]) > x) { break; } color[i][j] = 1; mn = a[i][j]; } else if (mx < a[i][j]) { if (dist(mn, a[i][j]) > x) { break; } color[i][j] = 1; mx = a[i][j]; } color[i][j] = 1; now = j; } mn_i = now; } } f = get(a, color, 1); s = get(a, color, 2); if (max(f, s) <= x) return 1; return 0; } void solve1() { int n, m; cin >> n >> m; vector<vector<int>> a(n, vector<int>(m)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j]; } } int l = -1, r = INF; while (r - l > 1) { int mid = (l + r) / 2; if (check(n, m, a, mid)) { r = mid; } else { l = mid; } } cout << r; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...