Advertisement
a_chn

Untitled

Jan 20th, 2024
939
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n;
  5. bool ans;
  6. int grid[505][505];
  7. bool visited[505][505];
  8. int dir[4][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};
  9. int maxi = 0;
  10. bool valid(int x, int y, int m, int a, int b) {
  11.     return x < n && x >= 0 && y < n && y >= 0 && !visited[x][y] && abs(grid[x][y]-grid[a][b]) <= m;
  12. }
  13.  
  14. bool bfs(int m) {
  15.     for(int ii = 0; ii < n; ii++) for(int jj = 0; jj < n; jj++) {
  16.         visited[ii][jj] = false;
  17.     }
  18.     for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) if(!visited[i][j]) {
  19.         queue<array<int, 2> > q;
  20.  
  21.         q.push({i, j});
  22.         visited[i][j] = true;
  23.         int c = 1;
  24.  
  25.         while(!q.empty()) {
  26.  
  27.             array<int, 2> temp = q.front();
  28.             q.pop();
  29.             int tx = temp[0], ty = temp[1];
  30.  
  31.             for(int ii = 0; ii < 4; ii++) {
  32.                 int nx = tx+dir[ii][0], ny = ty+dir[ii][1];
  33.                 if(valid(nx, ny, m, tx, ty)) {
  34.                     ++c;
  35.                     visited[nx][ny] = true;
  36.                     q.push({nx, ny});
  37.                 }
  38.             }
  39.         }
  40.  
  41.         if(c >= (n * n + 1) / 2) {
  42.             return true;
  43.         }
  44.  
  45.     }
  46.     return false;
  47.  
  48. }
  49.  void setIO(string s) {
  50.     ios_base::sync_with_stdio(0);
  51.     cin.tie(0);
  52.     freopen((s + ".in").c_str(), "r", stdin);
  53.     freopen((s + ".out").c_str(), "w", stdout);
  54. }
  55.  
  56. int main() {
  57.     setIO("tractor");
  58.     cin >> n;
  59.     for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) {
  60.         cin >> grid[i][j];
  61.         maxi = max(maxi, grid[i][j]);
  62.     }
  63.  
  64.  
  65.     int left = 0, right = maxi;
  66.  
  67.     while(left < right) {
  68.  
  69.         int mid = (left + right) / 2;
  70.         if(!bfs(mid)) {
  71.             left = mid + 1;
  72.         }
  73.         else {
  74.             right = mid;
  75.         }
  76.  
  77.     }
  78.  
  79.     cout << left << endl;
  80. }
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement