Advertisement
Guest User

Untitled

a guest
Jun 1st, 2016
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define F first
  6. //
  7. //#define LOCAL
  8. //
  9.  
  10. vector<pair<int,int>> g[1000001];
  11.  
  12. class maxtree{
  13. public:
  14. int n;
  15. vector<int> t;
  16.  
  17. void modify(int p, int value) {
  18. for (t[p += n] = value; p > 1; p >>= 1) t[p>>1] = max(t[p], t[p^1]);
  19. }
  20.  
  21. int query(int l, int r) {
  22. int res = -1000000000;
  23. for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
  24. if (l&1) res = max(res, t[l++]);
  25. if (r&1) res = max(t[--r], res);
  26. }
  27. return res;
  28. }
  29.  
  30. maxtree(int n):n(n),t(){
  31. t.resize(n << 1, -1000000000);
  32. }
  33. };
  34.  
  35. class mintree{
  36. public:
  37. int n;
  38. vector<int> t;
  39.  
  40. void modify(int p, int value) {
  41. for (t[p += n] = value; p > 1; p >>= 1) t[p>>1] = min(t[p], t[p^1]);
  42. }
  43.  
  44. int query(int l, int r) {
  45. int res = 1000000000;
  46. for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
  47. if (l&1) res = min(res, t[l++]);
  48. if (r&1) res = min(t[--r], res);
  49. }
  50. return res;
  51. }
  52.  
  53. mintree(int n):n(n),t(){
  54. t.resize(n << 1, 1000000000);
  55. }
  56. };
  57.  
  58. int n, m, p;
  59.  
  60. int main() {
  61. cin >> n >> m >> p;
  62. for (int i = 0; i < n; i++){
  63. for (int j = 0; j < m; j++){
  64. int a;
  65. scanf("%d", &a);
  66. if (a <= p){
  67. g[a].push_back({i + 1, j + 1});
  68. }
  69. }
  70. }
  71. for (int i = 0; i < p; i++){
  72. sort(g[i + 1].begin(), g[i + 1].end());
  73. }
  74. vector<maxtree> mat(n + 1, maxtree(400));
  75. vector<mintree> mit(n + 1, mintree(400));
  76.  
  77. g[0].push_back({1, 1});
  78. vector<int> ans;
  79. ans.resize(g[0].size(), 0);
  80. mat[1].modify(1, 1);
  81. mit[1].modify(1, 1);
  82.  
  83. for (int i = 1; i <= p; i++){
  84. vector<int> cur(g[i].size(), 1000000000);
  85. for (int j = 0; j < g[i].size(); j++){
  86. int x = g[i][j].F;
  87. int y = g[i][j].second;
  88. for (int k = 1; k <= n; k++){
  89. int rx = abs(k - x);
  90. int ry = 1000000000;
  91. int w;
  92. w = mat[k].query(1, y + 1);
  93. if (w != 1000000000)
  94. ry = min(ry, y - w);
  95. w = mit[k].query(y, mit[k].n);
  96. ry = min(ry, w - y);
  97. cur[j] = min(cur[j], rx + ry);
  98. }
  99. }
  100.  
  101. for (int j = 0; j < g[i - 1].size(); j++){
  102. mat[g[i - 1][j].F].modify(g[i - 1][j].second, -1000000000);
  103. mit[g[i - 1][j].F].modify(g[i - 1][j].second, 1000000000);
  104. }
  105. for (int j = 0; j < g[i].size(); j++){
  106. int x = g[i][j].F;
  107. int y = g[i][j].second;
  108. mat[x].modify(y, y - cur[j]);
  109. mit[x].modify(y, y + cur[j]);
  110. }
  111. ans.clear();
  112. ans = cur;
  113. }
  114. int res = 1000000000;
  115. for (int i = 0; i < ans.size(); i++){
  116. res = min(res, ans[i]);
  117. }
  118. cout << res;
  119.  
  120.  
  121. #ifdef LOCAL
  122. cerr << "TIME = " << 1. * clock() / CLOCKS_PER_SEC;
  123. #endif
  124. return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement