难度:3
看完李煜东书上的差分,来找了一道题来做,首先就是把序列上的区间操作转化为差分序列上的两点操作,然后它的题意,就是说找一个点,令左边,包含这个点,都是正数,这样左边递增,令右边都是负数,这样递减,
正好,差分序列的的操作就是一个加,一个减,统计一下,一个点左边至少需要加多少才能全正,统计一下点的右边至少减多少才能全变负,然后扫描一遍,按照下面的那个逻辑统计答案就可以了,然后考虑的时候左右两个端点的值是任意的,不需要复杂考虑
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int N = 200005;
int main() {
int n;
cin >> n;
int a[N] = {};
int b[N] = {};
ll left[N] = {};
ll right[N] = {};
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i] - a[i - 1];
if (b[i] <= 0) left[i] += left[i - 1] + 1 - b[i];
else left[i] += left[i - 1];
}
for (int i = n - 1; i >= 1; i--) {
if (b[i + 1] >= 0) right[i] += right[i + 1] + 1 + b[i + 1];
else right[i] += right[i + 1];
}
ll ans = (ll) pow(10, 18);
for (int i = 1; i <= n; i++) {
ans = min(ans, max(left[i], right[i]));
}
cout << ans;
return 0;
}