Advertisement
turmax

Untitled

Nov 14th, 2021
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.84 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. using ll = long long;
  6.  
  7. #define all(x) x.begin(), x.end()
  8.  
  9. struct sparse {
  10.     vector<vector<int>> sp;
  11.     vector<int> pw;
  12.  
  13.     sparse(vector<int> a) {
  14.         int n = a.size();
  15.         int k = 1;
  16.         while ((1 << (k - 1)) < n)
  17.             ++k;
  18.         sp.resize(k, vector<int> (n));
  19.         sp[0] = a;
  20.         for (int j = 1; j < k; ++j) {
  21.             for (int i = 0; i + (1 << (j - 1)) < n; ++i)
  22.                 sp[j][i] = min(sp[j - 1][i], sp[j - 1][i + (1 << (j - 1))]);
  23.         }
  24.         pw.resize(n + 1);
  25.         for (int i = 2; i <= n; ++i)
  26.             pw[i] = pw[i / 2] + 1;
  27.     }
  28.  
  29.     int get(int l, int r) {
  30.         int k = pw[r - l];
  31.         // cout << k << ' ' << l << ' ' << r << ' ' << sp[0].size() << ' ' << sp.size() << '\n';
  32.         return min(sp[k][l], sp[k][r - (1 << k)]);
  33.     }
  34. };
  35.  
  36. int main() {
  37.     std::ios_base::sync_with_stdio(false);
  38.     cin.tie(0), cout.tie(0);
  39.  
  40.     int n, m;
  41.     cin >> n >> m;
  42.     vector<pair<int, int>> a(m);
  43.     for (int i = 0; i < m; ++i) {
  44.         cin >> a[i].first >> a[i].second;
  45.         --a[i].first, --a[i].second;
  46.     }
  47.     const int inf = 1e9 + 228;
  48.     vector<int> dp(n, 0);
  49.     for (int i = 0; i < n; ++i) {
  50.         dp[i] = abs(i - a[0].first);
  51.     }
  52.     for (int j = 1; j < m; ++j) {
  53.         sparse t(dp);
  54.         vector<int> _dp(n, inf);
  55.         // for (int i : dp)
  56.         //  cout << i << ' ';
  57.         // cout << '\n';
  58.         int s1 = a[j].second - a[j].first + 1;
  59.         int s2 = a[j - 1].second - a[j - 1].first;
  60.         for (int i = 0; i < n; ++i) {
  61.             int tmp = i - s2;
  62.             if (tmp >= 0) {
  63.                 _dp[i] = min(_dp[i], t.get(tmp, i + 1));
  64.             } else {
  65.                 _dp[i] = min(_dp[i], t.get(0, i + 1));
  66.                 _dp[i] = min(_dp[i], t.get(n + tmp, n));
  67.             }
  68.             int k = i + s1;
  69.             if (k <= n) {
  70.                 _dp[i] = min(_dp[i], t.get(i, k));
  71.             } else {
  72.                 _dp[i] = min(_dp[i], t.get(i, n));
  73.                 _dp[i] = min(_dp[i], t.get(0, k - n));
  74.             }
  75.             _dp[i] += abs(i - a[j].first);
  76.         }
  77.         dp = _dp;
  78.     }
  79.     cout << *min_element(all(dp)) << '\n';
  80.    
  81.     return 0;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement