Advertisement
trungore10

Untitled

Sep 13th, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.48 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. void Read(int &val) {
  5. val = 0; char c;
  6. do { c = getchar(); } while (!isdigit(c));
  7. while (isdigit(c)) { val = val * 10 + c - '0'; c = getchar(); }
  8. }
  9.  
  10. typedef pair<int, int> ii;
  11. struct data {
  12. int u, v, x, y, val;
  13. data() {}; data(int u, int v, int x, int y, int val) : u(u), v(v), x(x), y(y), val(val) {};
  14. };
  15.  
  16. const int N = 1004;
  17. int n, a[N][N];
  18.  
  19. int h[4] = { -1, 0, 1, 0 }, c[4] = { 0, -1, 0, 1 };
  20. int numVer, ver[N][N][5];
  21. data Edge[2*N*N];
  22. vector<int> adj[2*N*N];
  23.  
  24. void Build_Graph() {
  25. for (int u = 1; u <= n; ++u) for (int v = 1; v <= n; ++v) {
  26. for (int dir = 0; dir < 4; ++dir) {
  27. int x = u + h[dir], y = v + c[dir];
  28. if (x < 1 || x > n || y < 1 || y > n) continue;
  29. int rDir = (dir + 2) % 4;
  30. if (ver[x][y][rDir] != 0) ver[u][v][dir] = ver[x][y][rDir];
  31. else {
  32. ver[u][v][dir] = ++numVer;
  33. Edge[numVer] = data(u, v, x, y, abs(a[u][v] - a[x][y]));
  34. }
  35. }
  36. }
  37.  
  38. for (int i = 1; i <= numVer; ++i) {
  39. int u = Edge[i].u, v = Edge[i].v;
  40. for (int dir = 0; dir < 4; ++dir) {
  41. int x = u + h[dir], y = v + c[dir];
  42. if (x < 1 || x > n || y < 1 || y > n) continue;
  43. if (x == Edge[i].x && y == Edge[i].y) continue;
  44. int Next = ver[u][v][dir];
  45. if ( abs(a[u][v] - a[x][y]) == Edge[i].val ) adj[i].push_back(Next);
  46. }
  47.  
  48. int x = Edge[i].x, y = Edge[i].y;
  49. for (int dir = 0; dir < 4; ++dir) {
  50. int u = x + h[dir], v = y + c[dir];
  51. if (u < 1 || u > n || v < 1 || v > n) continue;
  52. if (u == Edge[i].u && v == Edge[i].v) continue;
  53. int Next = ver[x][y][dir];
  54. if ( abs(a[u][v] - a[x][y]) == Edge[i].val ) adj[i].push_back(Next);
  55. }
  56. }
  57. }
  58.  
  59. bool vis[2*N*N], ok[N][N];
  60. vector<ii> vec;
  61.  
  62. void DFS(int u) {
  63. vis[u] = true;
  64. int tmpX = Edge[u].u, tmpY = Edge[u].v;
  65. if (!ok[tmpX][tmpY]) {
  66. vec.push_back(ii(tmpX, tmpY));
  67. ok[tmpX][tmpY] = true;
  68. }
  69. tmpX = Edge[u].x, tmpY = Edge[u].y;
  70. if (!ok[tmpX][tmpY]) {
  71. vec.push_back(ii(tmpX, tmpY));
  72. ok[tmpX][tmpY] = true;
  73. }
  74.  
  75. for (int v : adj[u]) {
  76. if (vis[v]) continue;
  77. //vis[v] = true;
  78. DFS(v);
  79. }
  80. }
  81.  
  82. void sol() {
  83. Build_Graph();
  84.  
  85. int res = 0;
  86. for (int i = 1; i <= numVer; ++i) {
  87. if (vis[i]) continue;
  88. DFS(i);
  89.  
  90. res = max(res, (int) vec.size());
  91. for (ii u : vec) ok[u.first][u.second] = false;
  92. vec.clear();
  93. }
  94. cout << res << '\n';
  95. }
  96.  
  97. int main() {
  98. freopen("input.txt", "r", stdin);
  99.  
  100. Read(n);
  101. for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) Read(a[i][j]);
  102.  
  103. sol();
  104.  
  105. return 0;
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement