Advertisement
ivnikkk

Untitled

Jan 22nd, 2022
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. #pragma GCC optimize("03")
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <iostream>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <iomanip>
  8. #include <fstream>
  9. #include <string>
  10. #include <set>
  11. #include <deque>
  12. #include <queue>
  13. #include <map>
  14. #include <bitset>
  15. #include <random>
  16. #include <cassert>
  17. #include <unordered_map>
  18. #include <unordered_set>
  19. #include <math.h>
  20. #include <chrono>
  21. #include <ctime>
  22. using namespace std;
  23. using namespace chrono;
  24. #define all(a) a.begin(), a.end()
  25. #define allr(a) a.rbegin(), a.rend()
  26. #define endl "\n"
  27. mt19937 rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count());
  28. typedef long long ll;
  29. typedef long double ld;
  30. struct Tree {
  31.     const ll inf = 1e18;
  32.     vector<ll> tree;
  33.     map<ll, ll> posit;
  34.     void init(ll n) {
  35.         tree.resize(4 * n, inf);
  36.     }
  37.     void update(ll v, ll tl, ll tr, ll pos, ll add) {
  38.         if (tl == tr) {
  39.             tree[v] = add;
  40.             posit[tl] = v;
  41.             return;
  42.         }
  43.         ll mid = (tl + tr) >> 1;
  44.         if (pos <= mid) {
  45.             update(v << 1, tl, mid, pos, add);
  46.         }
  47.         else {
  48.             update((v << 1) | 1, mid + 1, tr, pos, add);
  49.         }
  50.         tree[v] = min(tree[v << 1], tree[(v << 1) | 1]);
  51.     }
  52.     ll get_min(ll v, ll tl, ll tr, ll l, ll r) {
  53.         if (tr<l || tl>r) {
  54.             return inf;
  55.         }
  56.         if (tl >= l && tr <= r) {
  57.             return tree[v];
  58.         }
  59.         ll mid = (tl + tr) >> 1;
  60.         return min(get_min(v << 1, tl, mid, l, r), get_min((v<<1)|1, mid + 1, tr, l, r));
  61.     }
  62.     void update_el(ll n, ll pos, ll add) {
  63.         update(1, 0, n - 1, pos, add);
  64.     }
  65.     ll qet_mn_seg(ll n, ll l, ll r) {
  66.         return get_min(1, 0, n - 1, l, r);
  67.     }
  68. };
  69. signed main() {
  70. #ifdef _DEBUG
  71.     freopen("input.txt", "r", stdin);
  72.     freopen("output.txt", "w", stdout);
  73. #endif
  74.     ios_base::sync_with_stdio(false);
  75.     cin.tie(nullptr);
  76.     cout.tie(nullptr);
  77.     srand(time(NULL));
  78.     ll n, m;
  79.     cin >> n >> m;
  80.     vector<pair<ll, ll>> a(m);
  81.     vector<Tree> dp(m);
  82.     for (ll i = 0; i < m; i++) {
  83.         cin >> a[i].first >> a[i].second;
  84.         a[i].first--, a[i].second--;
  85.         dp[i].init(n);
  86.     }
  87.     for (ll i = 0; i < m; i++) {
  88.         for (ll j = 0; j < n; j++) {
  89.             if (i > 0) {
  90.                 if (i == 1) {
  91.                     cout << "";
  92.                 }
  93.                 ll len = a[i].second - a[i].first + (ll)1;
  94.                 ll len2 = a[i - 1].second - a[i - 1].first + 1;
  95.                 if (j - len + 1 < 0) {
  96.                     continue;
  97.                 }
  98.                 ll l = max(len2 - 1, j - len + 1), r = min(n - 1, j + len2 - 1);
  99.                 ll cur_min = dp[i - 1].qet_mn_seg(n, l, r);
  100.                 dp[i].update_el(n, j, cur_min + abs(a[i].second - j));
  101.             }
  102.             else {
  103.                 dp[i].update_el(n, j, abs(a[i].second - j));
  104.             }
  105.         }
  106.     }
  107.     ll ans = dp.back().tree[1];
  108.     cout << ans << endl;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement