Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using ll = long long;
- #define all(x) x.begin(), x.end()
- struct sparse {
- vector<vector<int>> sp;
- vector<int> pw;
- sparse(vector<int> a) {
- int n = a.size();
- int k = 1;
- while ((1 << (k - 1)) < n)
- ++k;
- sp.resize(k, vector<int> (n));
- sp[0] = a;
- for (int j = 1; j < k; ++j) {
- for (int i = 0; i + (1 << (j - 1)) < n; ++i)
- sp[j][i] = min(sp[j - 1][i], sp[j - 1][i + (1 << (j - 1))]);
- }
- pw.resize(n + 1);
- for (int i = 2; i <= n; ++i)
- pw[i] = pw[i / 2] + 1;
- }
- int get(int l, int r) {
- int k = pw[r - l];
- // cout << k << ' ' << l << ' ' << r << ' ' << sp[0].size() << ' ' << sp.size() << '\n';
- return min(sp[k][l], sp[k][r - (1 << k)]);
- }
- };
- int main() {
- std::ios_base::sync_with_stdio(false);
- cin.tie(0), cout.tie(0);
- int n, m;
- cin >> n >> m;
- vector<pair<int, int>> a(m);
- for (int i = 0; i < m; ++i) {
- cin >> a[i].first >> a[i].second;
- --a[i].first, --a[i].second;
- }
- const int inf = 1e9 + 228;
- vector<int> dp(n, 0);
- for (int i = 0; i < n; ++i) {
- dp[i] = abs(i - a[0].first);
- }
- for (int j = 1; j < m; ++j) {
- sparse t(dp);
- vector<int> _dp(n, inf);
- // for (int i : dp)
- // cout << i << ' ';
- // cout << '\n';
- int s1 = a[j].second - a[j].first + 1;
- int s2 = a[j - 1].second - a[j - 1].first;
- for (int i = 0; i < n; ++i) {
- int tmp = i - s2;
- if (tmp >= 0) {
- _dp[i] = min(_dp[i], t.get(tmp, i + 1));
- } else {
- _dp[i] = min(_dp[i], t.get(0, i + 1));
- _dp[i] = min(_dp[i], t.get(n + tmp, n));
- }
- int k = i + s1;
- if (k <= n) {
- _dp[i] = min(_dp[i], t.get(i, k));
- } else {
- _dp[i] = min(_dp[i], t.get(i, n));
- _dp[i] = min(_dp[i], t.get(0, k - n));
- }
- _dp[i] += abs(i - a[j].first);
- }
- dp = _dp;
- }
- cout << *min_element(all(dp)) << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement