sacgajcvs

Untitled

Nov 1st, 2020
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.02 KB | None | 0 0
  1. /*
  2. // Sample code to perform I/O:
  3.  
  4. cin >> name; // Reading input from STDIN
  5. cout << "Hi, " << name << ".\n"; // Writing output to STDOUT
  6.  
  7. // Warning: Printing unwanted or ill-formatted data to output will cause the test cases to fail
  8. */
  9.  
  10. // Write your code here
  11. #include<bits/stdc++.h>
  12. #define ll long long
  13. #define rep(i,a,b) for(int i = a; i < b; i++)
  14. using namespace std;
  15.  
  16. ll dp[105][10005][2];
  17. bool vis[105][10005][2];
  18. ll n,m,l;
  19. pair<ll,ll> v[105][10005];
  20.  
  21. ll lowerBound(ll i,ll num) {
  22. ll mid, l = 0, r = m - 1;
  23. while(l <= r) {
  24. mid = (l + r) / 2;
  25. if(v[i][mid].first < num) {
  26. l = mid + 1;
  27. } else {
  28. r = mid - 1;
  29. }
  30. }
  31. return r + 1;
  32. }
  33.  
  34. ll fun(ll i,ll j,ll dir) {
  35. if(j < 0 || j >= m) {
  36. return -5000000000000;
  37. }
  38. ll& ans = dp[i][j][dir];
  39. if(vis[i][j][dir]) {
  40. return ans;
  41. }
  42. vis[i][j][dir] = 1;
  43. ans = -LLONG_MAX;
  44. if(i == n - 1) {
  45. if(dir == 0) {
  46. if(j != m - 1) {
  47. ans = max(ans, fun(i, j + 1, 0) - (v[i][j + 1].first - v[i][j].first));
  48. }
  49. if( j != 0) {
  50. ans = max(ans, fun(i, j - 1, 1) - (v[i][j].first - v[i][j - 1].first));
  51. }
  52. ans = max(ans, v[i][j].second - abs(v[i][j].first - l));
  53. } else {
  54. if( j != 0) {
  55. ans = max(ans, fun(i, j - 1, 1) - (v[i][j].first - v[i][j - 1].first));
  56. }
  57. ans = max(ans, v[i][j].second - abs(v[i][j].first - l));
  58. }
  59. return ans;
  60. }
  61. ll ps;
  62. ps = (lowerBound(i + 1, v[i][j].first));
  63. if(dir == 0) {
  64. if(j != m - 1)
  65. ans = max(ans, fun(i, j + 1, 0) - (v[i][j + 1].first - v[i][j].first));
  66. if(j != 0)
  67. ans = max(ans, fun(i, j - 1, 1) - (v[i][j].first - v[i][j - 1].first));
  68. if(ps <= m - 1)
  69. ans = max(ans, fun(i + 1, ps, 0) - abs(v[i][j].first - v[i + 1][ps].first) + v[i][j].second);
  70. if(ps != 0)
  71. ans = max(ans, fun(i + 1, ps - 1, 1) - abs(v[i][j].first - v[i + 1][ps - 1].first) + v[i][j].second);
  72. } else {
  73. if(j != 0)
  74. ans = max(ans, fun(i, j - 1, 1) - (v[i][j].first - v[i][j - 1].first));
  75. if(ps <= m - 1)
  76. ans = max(ans, fun(i + 1, ps, 0) - abs(v[i][j].first - v[i + 1][ps].first) + v[i][j].second);
  77. if(ps != 0)
  78. ans = max(ans, fun(i + 1, ps - 1, 1) - abs(v[i][j].first - v[i + 1][ps - 1].first) + v[i][j].second);
  79. }
  80. return ans;
  81. }
  82.  
  83. void solve() {
  84. cin >> n;
  85. rep(i,0,n) {
  86. rep(j,0,m) {
  87. cin >> v[i][j].first;
  88. }
  89. }
  90. rep(i,0,n) {
  91. rep(j,0,m) {
  92. cin >> v[i][j].second;
  93. }
  94. }
  95. rep(i,0,n) {
  96. sort(v[i], v[i] + m);
  97. }
  98. rep(i,0,n + 1) {
  99. rep(j,0,m + 1) {
  100. rep(k, 0, 2) {
  101. vis[i][j][k] = 0;
  102. }
  103. }
  104. }
  105. cout << fun(0,0,0) - v[0][0].first << endl;
  106. }
  107.  
  108. int main() {
  109. ll TESTS = 1;
  110. cin >> TESTS;
  111. while(TESTS--) {
  112. solve();
  113. }
  114. return 0;
  115. }
  116.  
Advertisement
Add Comment
Please, Sign In to add comment