Advertisement
double_trouble

Untitled

Nov 15th, 2015
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <vector>
  5. #include <cmath>
  6. #include <string>
  7. #include <algorithm>
  8. #include <string>
  9. #include <deque>
  10. #include <iomanip>
  11.  
  12. #define F first
  13. #define S second
  14.  
  15. using namespace std;
  16.  
  17. const long double eps2 = 0.0000005;
  18. const long double eps1 = 1e-5;
  19. const long double pi = 3.1415926535897932;
  20.  
  21. vector <pair <int, int> > otr;
  22. int dp[100010][2];
  23. int tree[400004];
  24.  
  25. void query(int v, int l, int r, int ql, int qr, int i)
  26. {
  27.     if (l == ql && r == qr)
  28.     {
  29.         tree[v] = i;
  30.         return;
  31.     }
  32.  
  33.     int m = (l + r) / 2;
  34.  
  35.     if (qr <= m)
  36.         return query(2 * v + 1, l, m, ql, qr, i);
  37.    
  38.     if (ql >= m)
  39.         return query(2 * v + 2, m, r, ql, qr, i);
  40.  
  41.     query(2 * v + 1, l, m, ql, m, i);
  42.     query(2 * v + 2, m, r, m, qr, i);
  43.  
  44. }
  45.  
  46. int findprep(int v, int l , int r, int i)
  47. {
  48.     if (l +1 == r)
  49.         return tree[v];
  50.  
  51.     int m = (l + r) / 2;
  52.    
  53.     int ans;
  54.     if (i < m)
  55.         ans = findprep(2 * v + 1, l, m, i);
  56.     else
  57.         ans = findprep(2 * v + 2, m, r, i);
  58.    
  59.     return max(ans, tree[v]);
  60. }
  61.  
  62. int main()
  63. {
  64.     ios_base::sync_with_stdio(0);
  65.     freopen("input.txt", "r", stdin);
  66.     //      freopen("output.txt", "w", stdout);
  67.  
  68.     int n, s, k;
  69.     cin >> n >> s >> k;
  70.     s--;
  71.  
  72.     int l, r;
  73.     for (int i = 0; i < k; i++)
  74.     {
  75.         cin >> l >> r;
  76.         l--; r--;
  77.         otr.push_back(make_pair(l, r));
  78.        
  79.     }
  80.  
  81.     for (int i = 0; i < 100010; i++)
  82.         for (int j = 0; j < 2; j++)
  83.             dp[i][j] = 0;
  84.     int v1, v2;
  85.  
  86.     for (int i = k - 1; i >= 0; i--)
  87.     {
  88.         v1 = findprep(0, 0, n, otr[i].F - 1); v1 = k - (v1-1);
  89.         v2 = findprep(0, 0, n, otr[i].S + 1); v2 = k - (v2-1);
  90.  
  91.         if (otr[i].F > 0)
  92.         {
  93.             if (v1 > 0 && v1 <= k)
  94.             {
  95.                 v1--;
  96.                 if (dp[v1][0] >= 0 && dp[v1][1] >= 0)
  97.                     dp[i][0] = min(dp[v1][0] + abs(otr[v1].F - otr[i].F), dp[v1][1] + abs(otr[v1].S - otr[i].F + 2));
  98.                 else
  99.                     if (dp[v1][0] >= 0)
  100.                         dp[i][0] = dp[v1][0] + abs(otr[v1].F - otr[i].F);
  101.                     else
  102.                         dp[i][0] = dp[v1][1] + abs(otr[v1].S - otr[i].F + 2);
  103.             }
  104.         }
  105.         else
  106.             dp[i][0] = -1;
  107.  
  108.         if (otr[i].S < n - 1)
  109.         {
  110.             if (v2 > 0 && v2 <= k)
  111.             {
  112.                 v2--;
  113.                 if (dp[v2][0] >= 0 && dp[v2][1] >= 0)
  114.                     dp[i][1] = min(dp[v2][0] + abs(otr[i].S - otr[v2].F + 2), dp[v2][1] + abs(otr[i].S - otr[v2].S));
  115.                 else
  116.                     if (dp[v2][0] >= 0)
  117.                         dp[i][1] = dp[v2][0] + abs(otr[i].S - otr[v2].F + 2);
  118.                     else
  119.                         dp[i][1] = dp[v2][1] + abs(otr[i].S - otr[v2].S);
  120.             }
  121.         }
  122.         else
  123.             dp[i][1] = -1;
  124.         query(0, 0, n, otr[i].first, otr[i].second + 1, k - /*(i + 1)*/ i);
  125.     }
  126.  
  127.     int v = findprep(0, 1, n + 1, s);
  128.     v--;
  129.  
  130.     if (dp[v][0] >= 0 && dp[v][1] >= 0)
  131.         cout << min(dp[v][0] + s - otr[v].F + 1, dp[v][1] + otr[v].S + 1) << endl;
  132.     else
  133.     {
  134.         if (dp[v][0] >= 0)
  135.             cout << dp[v][0] + s - otr[v].F + 1 << endl;
  136.         else
  137.             cout << dp[v][1] + otr[v].S + 1 << endl;
  138.     }
  139.  
  140.     cout << endl;
  141.     cout << v << endl;
  142.  
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement