Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.15 KB | None | 0 0
  1. #include <fstream>
  2. #include <deque>
  3.  
  4. #define NMAX 1005
  5. using namespace std;
  6.  
  7. ifstream fin("struti.in");
  8. ofstream fout("struti.out");
  9.  
  10. int mat[NMAX][NMAX], n, m, p, lg1, lg2;
  11. deque<int> maxxL[NMAX], minnL[NMAX], maxxC, minnC, auxM[NMAX], auxMa[NMAX], aux1, aux2;
  12.  
  13. void addL(int i, int j){
  14. while(!minnL[i].empty() && minnL[i].back() > mat[i][j])
  15. minnL[i].pop_back();
  16. minnL[i].push_back(mat[i][j]);
  17.  
  18. while(!maxxL[i].empty() && maxxL[i].back() < mat[i][j])
  19. maxxL[i].pop_back();
  20. maxxL[i].push_back(mat[i][j]);
  21. }
  22.  
  23. void addC(int i){
  24. while(!minnC.empty() && minnC.back() > minnL[i].front())
  25. minnC.pop_back();
  26. minnC.push_back(minnL[i].front());
  27.  
  28. while(!maxxC.empty() && maxxC.back() < maxxL[i].front())
  29. maxxC.pop_back();
  30. maxxC.push_back(maxxL[i].front());
  31. }
  32.  
  33. int solve(int l, int c, int& lg){
  34. for(int i = 1; i <= n; ++i)
  35. minnL[i].clear(), maxxL[i].clear();
  36. maxxC.clear();
  37. minnC.clear();
  38. for(int j = 1; j <= c; ++j)
  39. for(int i = 1; i <= l; ++i)
  40. addL(i, j);
  41. for(int i = 1; i <= l; ++i)
  42. addC(i);
  43. int minD = (1 << 30);
  44. for(int i = l; i <= n; ++i){
  45. aux1 = maxxC;
  46. aux2 = minnC;
  47. for(int k = i - l + 1; k <= n; ++k)
  48. auxM[k] = minnL[k], auxMa[k] = maxxL[k];
  49. for(int j = c; j <= m; ++j){
  50. int val = maxxC.front() - minnC.front();
  51. if(val < minD){
  52. minD = val;
  53. lg = 0;
  54. }
  55. if(val == minD)
  56. ++lg;
  57. for(int k = i - l + 1; k <= i; ++k){
  58. if(mat[k][j - c + 1] == maxxL[k].front()){
  59. if(maxxC.front() == maxxL[k].front())
  60. maxxC.pop_front();
  61. maxxL[k].pop_front();
  62. }
  63. if(mat[k][j - c + 1] == minnL[k].front()){
  64. if(minnC.front() == minnL[k].front())
  65. minnC.pop_front();
  66. minnL[k].pop_front();
  67. }
  68. addL(k, j + 1);
  69. addC(k);
  70. }
  71. }
  72.  
  73. maxxC = aux1;
  74. minnC = aux2;
  75. for(int k = i - l + 1; k <= i; ++k)
  76. minnL[k] = auxM[k], maxxL[k] = auxMa[k];
  77. if(maxxC.front() == maxxL[i - l + 1].front())
  78. maxxC.pop_front();
  79. if(minnC.front() == minnL[i - l + 1].front())
  80. minnC.pop_front();
  81. for(int j = 1; j <= c; ++j)
  82. addL(i + 1, j);
  83. addC(i + 1);
  84. }
  85. return minD;
  86. }
  87.  
  88. int main()
  89. {
  90. fin >> n >> m >> p;
  91.  
  92. for(int i = 1; i <= n; ++i)
  93. for(int j = 1; j <= m; ++j)
  94. fin >> mat[i][j];
  95.  
  96. for(int i = 1; i <= p; ++i){
  97. int dx, dy;
  98. fin >> dx >> dy;
  99.  
  100. lg1 = 0, lg2 = 0;
  101. int val1 = solve(dx, dy, lg1);
  102. int val2 = solve(dy, dx, lg2);
  103. if(val1 == val2)
  104. fout << val1 << ' ' << lg1 + lg2 << '\n';
  105. else {
  106. if(val1 < val2)
  107. fout << val1 << ' ' << lg1 << '\n';
  108. else fout << val2 << ' ' << lg2 << '\n';
  109. }
  110. }
  111. return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement