fork download
  1. #include <bits/stdc++.h>
  2.  
  3. #define ll long long
  4. #define el cout << '\n'
  5.  
  6. using namespace std;
  7.  
  8. const int maxn = 5;
  9. const int maxm = 1e5;
  10. const int maxq = 1e5;
  11. const ll INF = 1e18;
  12. const int dx[] = {0, 1, 0, -1};
  13. const int dy[] = {1, 0, -1, 0};
  14.  
  15. struct Query
  16. {
  17. int x, y, u, v, id;
  18.  
  19. Query(int x = 0, int y = 0, int u = 0, int v = 0, int id = 0) :
  20. x(x), y(y), u(u), v(v), id(id) {};
  21. };
  22. struct Node
  23. {
  24. int x, y;
  25. ll dist;
  26.  
  27. Node(int x = 0, int y = 0, ll dist = 0) :
  28. x(x), y(y), dist(dist) {};
  29. bool operator > (const Node &other) const
  30. {
  31. return dist > other.dist;
  32. }
  33. };
  34.  
  35. int n, m, q;
  36. ll a[maxn + 10][maxm + 10], dist[maxn + 10][maxn + 10][maxm + 10], ans[maxq + 10];
  37. vector<Query> qrs;
  38.  
  39. void dijkstra(int id, int l, int r, int x, int y)
  40. {
  41. for (int i = 1; i <= n; i++)
  42. fill(dist[id][i] + l, dist[id][i] + r + 1, INF);
  43. priority_queue<Node, vector<Node>, greater<Node>> pq;
  44. dist[id][x][y] = a[x][y];
  45. pq.push(Node(x, y, a[x][y]));
  46.  
  47. while (pq.size())
  48. {
  49. Node t = pq.top();
  50. pq.pop();
  51. int x = t.x;
  52. int y = t.y;
  53. ll d = t.dist;
  54.  
  55. if (d > dist[id][x][y])
  56. continue;
  57. for (int k = 0; k < 4; k++)
  58. {
  59. int nxt_x = x + dx[k];
  60. int nxt_y = y + dy[k];
  61. if (nxt_y > r || nxt_y < l || nxt_x < 1 || nxt_x > n)
  62. continue;
  63. if (dist[id][nxt_x][nxt_y] > dist[id][x][y] + a[nxt_x][nxt_y])
  64. {
  65. dist[id][nxt_x][nxt_y] = dist[id][x][y] + a[nxt_x][nxt_y];
  66. pq.push(Node(nxt_x, nxt_y, dist[id][nxt_x][nxt_y]));
  67. }
  68. }
  69. }
  70. }
  71.  
  72. void dnc(int l, int r, vector<Query> & qrs)
  73. {
  74. if (qrs.empty())
  75. return ;
  76. int m = l + r >> 1;
  77. for (int i = 1; i <= n; i++)
  78. dijkstra(i, l, r, i, m);
  79. for (Query qr : qrs)
  80. for (int i = 1; i <= n; i++)
  81. ans[qr.id] = min(ans[qr.id], dist[i][qr.x][qr.y] + dist[i][qr.u][qr.v] - a[i][m]);
  82. if (l == r)
  83. return ;
  84. vector<Query> left_qrs, right_qrs;
  85.  
  86. for (Query qr : qrs)
  87. {
  88. if (qr.v <= m)
  89. left_qrs.push_back(qr);
  90. if (qr.y > m)
  91. right_qrs.push_back(qr);
  92. }
  93. dnc(1, m, left_qrs);
  94. dnc(m + 1, r, right_qrs);
  95. }
  96.  
  97. int main()
  98. {
  99. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  100. if (fopen("SHORTEST.INP", "r"))
  101. {
  102. freopen("SHORTEST.INP", "r", stdin);
  103. freopen("SHORTEST.OUT", "w", stdout);
  104. }
  105.  
  106. cin >> n >> m;
  107. for (int i = 1; i <= n; i++)
  108. for (int j = 1; j <= m; j++)
  109. cin >> a[i][j];
  110. cin >> q;
  111. for (int i = 1; i <= q; i++)
  112. {
  113. int x, y, u, v;
  114. cin >> x >> y >> u >> v;
  115. if (y > v)
  116. {
  117. swap(x, u);
  118. swap(y, v);
  119. }
  120. ans[i] = INF;
  121. qrs.push_back(Query(x, y, u, v, i));
  122. }
  123. dnc(1, m, qrs);
  124. for (int i = 1; i <= q; i++)
  125. cout << ans[i], el;
  126. }
  127.  
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Standard output is empty