Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <cstdio>
- #include <climits>
- #include <vector>
- #include <cmath>
- #include <string>
- #include <algorithm>
- #include <string>
- #include <deque>
- #include <iomanip>
- #define F first
- #define S second
- using namespace std;
- const long double eps2 = 0.0000005;
- const long double eps1 = 1e-5;
- const long double pi = 3.1415926535897932;
- const long long inf = INT_MAX / 2;
- vector <pair <long long, long long> > otr;
- pair <long long, long long> dp[100010];
- //long long tree[400004];
- vector<long long> tree;
- void query(long long v, long long l, long long r, long long ql, long long qr, long long i)
- {
- if (l == ql && r == qr)
- {
- tree[v] = i;
- return;
- }
- long long m = (l + r) / 2;
- if (qr <= m)
- return query(2 * v + 1, l, m, ql, qr, i);
- if (ql >= m)
- return query(2 * v + 2, m, r, ql, qr, i);
- query(2 * v + 1, l, m, ql, m, i);
- query(2 * v + 2, m, r, m, qr, i);
- }
- long long findprep(long long v, long long l, long long r, long long i)
- {
- if (l + 1 == r)
- return tree[v];
- long long m = (l + r) / 2;
- long long ans;
- if (i < m)
- ans = findprep(2 * v + 1, l, m, i);
- else
- ans = findprep(2 * v + 2, m, r, i);
- return min(ans, tree[v]);
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- //freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- long long n, s, k;
- cin >> n >> s >> k;
- s--;
- s--;
- tree.resize(400004);
- tree.assign(400004, inf);
- otr.push_back(make_pair(0, s));
- long long l, r;
- for (long long i = 0; i < k; i++)
- {
- cin >> l >> r;
- l--; r--;
- otr.push_back(make_pair(l, r));
- }
- for (long long i = 0; i < 100010; i++)
- dp[i] = make_pair(0, 0);
- long long v1, v2;
- bool f1, f2;
- for (long long i = k; i >= 0; i--)
- {
- f1 = 1;
- f2 = 1;
- long long x = otr[i].F;
- long long y = otr[i].S;
- if (x == 0)
- {
- dp[i].F = inf;
- f1 = 0;
- }
- if (y == n - 1)
- {
- dp[i].S = inf;
- f2 = 0;
- }
- if (f1)
- v1 = findprep(0, 0, n + 1, x - 1);
- if (f2)
- v2 = findprep(0, 0, n + 1, y + 1);
- if (f1)
- {
- if (v1 == inf)
- {
- dp[i].F = 0;
- }
- else
- {
- dp[i].F = min(dp[v1].F + x - otr[v1].F, dp[v1].S + (otr[v1].S + 1 - (x - 1)));
- }
- }
- if (f2)
- {
- if (v2 == inf)
- {
- dp[i].S = 0;
- }
- else
- {
- dp[i].S = min(dp[v2].F + y + 1 - (otr[v2].F - 1), dp[v2].S + otr[v2].S - y);
- }
- }
- if (x <= y)
- query(0, 0, n + 1, x, y + 1, i);
- }
- cout << dp[0].S << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement