CF EDU 127 D - Insert a Progression
阿新 • • 發佈:2022-05-12
D - Insert a Progression
絕對值
首先算出不插入時的答案
-
如果插入的數在 [minn, maxn] 中,則沒有代價
-
如果 x > maxn, 則有 \((maxn,x]\) 這些數要產生代價,把他們放到最大值後面,則代價為 \(2*(x-maxn)\)
若放到開頭或結尾,則代價是 \(x-a[1]\) 或 \(x-a[n]\), 三者取最小值
-
如果 minn > 1, 同理
#include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <cmath> using namespace std; typedef long long ll; const int N = 2e5 + 10; int n, x; int a[N]; int main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T; cin >> T; while(T--) { cin >> n >> x; for (int i = 1; i <= n; i++) cin >> a[i]; ll ans = 0; int maxn = a[1], minn = a[1]; for (int i = 2; i <= n; i++) { ans += abs(a[i] - a[i-1]); maxn = max(maxn, a[i]); minn = min(minn, a[i]); } if (minn > 1) { int add = min({2 * (minn - 1), a[1] - 1, a[n] - 1}); ans += add; } if (maxn < x) { int add = min({2 * (x - maxn), x - a[1], x- a[n]}); ans += add; } cout << ans << endl; } return 0; }