Advertisement
double_trouble

лыжи

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