Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define task "CAU4_14"
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- using ll = long long;
- using ld = long double;
- constexpr int N = 1e3 + 5;
- constexpr int Inf = 1e9 + 7;
- int n, k, a[N], m, b[N];
- void Read()
- {
- cin >> n >> k;
- for (int i = 1; i <= n; ++i)
- cin >> a[i];
- }
- void Solve()
- {
- for (int i = 1; i <= n; ++i)
- if (i != k)
- b[++m] = a[i];
- int ans(Inf);
- sort(b + 1, b + m + 1);
- if (n == 1)
- ans = 0;
- else if (k == 1 || k == n)
- ans = min(abs(a[k] - b[m]), abs(a[k] - b[1])) + abs(b[m] - b[1]);
- else if (k == 2 || k == n - 1)
- {
- if (n == 3)
- ans = abs(a[k] - b[1]) + abs(a[k] - b[m]);
- else
- {
- // 1-k-(2, m) or (2, m)-k-1
- ans = min(ans, (b[m] - b[2]) + abs(b[1] - a[k]) + min(abs(b[m] - a[k]), abs(b[2] - a[k])));
- // m-k-(1,m-1) or (1, m-1)-k-m
- ans = min(ans, (b[m - 1] - b[1]) + abs(b[m] - a[k]) + min(abs(b[1] - a[k]), abs(b[m - 1] - a[k])));
- // i-k-(1, m) or (1, m)-k-i
- for (int i = 2; i < m; ++i)
- ans = min(ans, abs(b[i] - a[k]) + (b[m] - b[1]) + min(abs(b[m] - a[k]), abs(b[1] - a[k])));
- }
- }
- else
- {
- for (int i = 2; i < m; ++i)
- for (int j = i + 1; j < m; ++j)
- {
- // (1, m)-k-(i,j) or (i,j)-k-(1,m)
- if (j - i + 1 >= n - k || j - i + 1 >= k - 1)
- ans = min(ans, (b[m] - b[1]) + (b[j] - b[i]) + min(abs(b[m] - a[k]), abs(b[1] - a[k])) + min(abs(b[i] - a[k]), abs(b[j] - a[k])));
- // (1, i)-k-(j,m) or (j, m)-k-(1,i)
- if (j == i + 1 && (i == k - 1 || i == n - k))
- ans = min(ans, (b[i] - b[1]) + (b[m] - b[j]) + min(abs(b[1] - a[k]), abs(b[i] - a[k])) + min(abs(b[j] - a[k]), abs(b[m] - a[k])));
- }
- }
- cout << ans;
- }
- int32_t main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- if (fopen(task ".INP", "r"))
- {
- freopen(task ".INP", "r", stdin);
- freopen(task ".OUT", "w", stdout);
- }
- Read();
- Solve();
- }
Add Comment
Please, Sign In to add comment