难度:5
因为是对区间上所有数的操作,所以很自然想到了差分,求出差分序列,然后就把修改一个区间上的数的操作转化为修改两个值,题目说让序列所有数相等,那么就等价于操作过后让差分序列的第一个数为一个值,然后2到n为0,题目说问有几种可能的情况,就是问第一个数的值可能有多少种情况,
上面三个等价完了,就把原序列区间上的操作转化到了差分序列上,对于差分序列一次改变两个数,那么可能的有四种情况,又因为差分序列可以分为3段,1,2到n,n+1,所有排列组合有四种情况,列出来这四种情况,
首先是问操作最少,然后在操作最少的基础上推出来最终结果即可,
#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 = 100005;
int main() {
int n;
cin >> n;
int a[N] = {};
int b[N];
ll x1 = 0, x2 = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i] - a[i - 1];
if (i > 1) {
if (b[i] > 0) x1 += b[i];
else x2 -= b[i];
}
}
cout << max(x1, x2) << endl << 1 + abs(x1 - x2);
return 0;
}