Advertisement
kdzhr

Untitled

Feb 12th, 2020
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.87 KB | None | 0 0
  1. # include <iostream>
  2. # include <vector>
  3. const int32_t MAX = 1000000000;
  4. using namespace std;
  5.  
  6. int main() {
  7.     int32_t n;
  8.     cin >> n;
  9.     vector<int32_t> a(n);
  10.     vector<int32_t> b(n);
  11.     vector<vector<int32_t>> dp(n);
  12.     vector<vector<int32_t>> prev(n);
  13.     vector<vector<pair<int32_t, int32_t>>> count(n);
  14.     for (size_t i = 0; i < n; i++) {
  15.         dp[i].resize(2, MAX);
  16.         count[i].resize(2);
  17.         prev[i].resize(2);
  18.     }
  19.     for (size_t i = 0; i < n; i++) {
  20.         cin >> a[i];
  21.     }
  22.     for (size_t i = 0; i < n; i++) {
  23.         cin >> b[i];
  24.     }
  25.     prev[0][0] = 0;
  26.     prev[0][1] = 0;
  27.     count[0][0].first = 1;
  28.     count[0][0].second = 0;
  29.     count[0][1].first = 0;
  30.     count[0][1].second = 1;
  31.     dp[0][0] = 0;
  32.     dp[0][1] = 0;
  33.     for (size_t i = 0; i < n - 1; i++) {
  34.         if (i % 2 == 0) {
  35.             if (max(dp[i][0], abs(a[i + 1] - a[i])) < dp[i + 1][0]) {
  36.                 dp[i + 1][0] = max(dp[i][0], abs(a[i + 1] - a[i]));
  37.                 prev[i + 1][0] = 0;
  38.                 count[i + 1][0].first = count[i][0].first + 1;
  39.                 count[i + 1][0].second = count[i][0].second;
  40.             }
  41.             if (max(dp[i][0], abs(b[i + 1] - a[i])) < dp[i + 1][1]) {
  42.                 dp[i + 1][1] = max(dp[i][0], abs(b[i + 1] - a[i]));
  43.                 prev[i + 1][1] = 0;
  44.                 count[i + 1][1].first = count[i][0].first;
  45.                 count[i + 1][1].second = count[i][0].second + 1;
  46.             }
  47.  
  48.             if (max(dp[i][1], abs(a[i + 1] - b[i])) < dp[i + 1][0]) {
  49.                 dp[i + 1][0] = max(dp[i][1], abs(a[i + 1] - b[i]));
  50.                 prev[i + 1][0] = 1;
  51.                 count[i + 1][0].first = count[i][1].first + 1;
  52.                 count[i + 1][0].second = count[i][1].second;
  53.             }
  54.             if (max(dp[i][1], abs(b[i + 1] - b[i])) < dp[i + 1][1]) {
  55.                 dp[i + 1][1] = max(dp[i][1], abs(b[i + 1] - b[i]));
  56.                 prev[i + 1][1] = 1;
  57.                 count[i + 1][1].first = count[i][1].first;
  58.                 count[i + 1][1].second = count[i][1].second + 1;
  59.             }
  60.         }
  61.         else {
  62.             int32_t rev = count[i][0].first - count[i][0].second;
  63.             if (rev == 2 || rev == 0) {
  64.                 if (max(dp[i][0], abs(b[i + 1] - a[i])) < dp[i + 1][1]) {
  65.                     dp[i + 1][1] = max(dp[i][0], abs(b[i + 1] - a[i]));
  66.                     prev[i + 1][1] = 0;
  67.                     count[i + 1][1].first = count[i][0].first;
  68.                     count[i + 1][1].second = count[i][0].second + 1;
  69.                 }
  70.             }
  71.             if (rev == -2 || rev == 0) {
  72.                 if (max(dp[i][0], abs(a[i + 1] - a[i])) < dp[i + 1][0]) {
  73.                     dp[i + 1][0] = max(dp[i][0], abs(a[i + 1] - a[i]));
  74.                     prev[i + 1][0] = 0;
  75.                     count[i + 1][0].first = count[i][0].first + 1;
  76.                     count[i + 1][0].second = count[i][0].second;
  77.                 }
  78.             }
  79.  
  80.             rev = count[i][1].first - count[i][1].second;
  81.             if (rev == 2 || rev == 0) {
  82.                 if (max(dp[i][1], abs(b[i + 1] - b[i])) < dp[i + 1][1]) {
  83.                     dp[i + 1][1] = max(dp[i][1], abs(b[i + 1] - b[i]));
  84.                     prev[i + 1][1] = 1;
  85.                     count[i + 1][1].first = count[i][1].first;
  86.                     count[i + 1][1].second = count[i][1].second + 1;
  87.                 }
  88.             }
  89.             if (rev == -2 || rev == 0) {
  90.                 if (max(dp[i][1], abs(a[i + 1] - b[i])) < dp[i + 1][0]) {
  91.                     dp[i + 1][0] = max(dp[i][1], abs(a[i + 1] - b[i]));
  92.                     prev[i + 1][0] = 1;
  93.                     count[i + 1][0].first = count[i][1].first + 1;
  94.                     count[i + 1][0].second = count[i][1].second;
  95.                 }
  96.             }
  97.         }
  98.     }
  99.     cout << min(dp[n - 1][0], dp[n - 1][1]);
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement