- 题目要求,让该数组所有数字全部相同
- 通过差分的思路,让d[]数组记录差值,并且操作使得d[]内(2-n)全部为0(说明a1-an没有差值)
d数组内abs(正数)与abs(负数)的差值 关系 可能的方案次数。
- 由于按照题目(l,r)范围对数组进行加1(减1)的操作,对应到d数组上就是
d[l]++
,d[r+1]--
. - 若d数组内abs(正数)与abs(负数)相同,
-
- 则可以轻易使得d2到dn全部为0
- 如果d数组内abs(正数)与abs(负数)不同,
-
- d2到dn内就会剩下一个不为零的dx,大小为abs(正数)与abs(负数)的差值
-
- 此时为了使dx变成0,就有两种方法,
-
-
- 一个是b1与bx操作
-
-
-
- 一个是bn+1与bx操作
-
-
- 此操作的排列组合对应着有多少种可能性
假设b数组内为[4,0,0,0,0,2,0,0]
可以让b1+1,b6-2,
也可以让b6-2, b1+1, b9 ++
还可以让b6-2, b9 +2
* 所以可能结果有abs(正数)与abs(负数)的差值+1种
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 500010;
int n,a[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
for (int i = n; i; i -- ) a[i] -= a[i - 1];
LL pos = 0, neg = 0;
for (int i = 2; i <= n; i ++ )
if (a[i] > 0) pos += a[i];
else neg -= a[i];
cout << min(pos, neg) + abs(pos - neg) << endl;
cout << abs(pos - neg) + 1 << endl;
return 0;
}