原题链接:https://www.acwing.com/problem/content/101/
题目分析
题目中描述的操作需要我们使用差分数组
最少操作数
a区间的加减一可以变为差分数组b中两个元素left和right+1的加减1。
因为bi=ai-a(i-1)所以最后就是差分数组从2到n全部变为0,只剩下1和n+1
b[1]=a[1],也就是说最后所有元素都等于第一个元素
b[n+1]=a[n+1]-a[n];它存在是因为有时候要修改a[n]
最少的操作数就是将正负数配对一个加一个减,但是可能有数不够用
我们可以用a[1]和a[n+1]但是他们不用==0所以是min(pos, neg)+abs|pos-neg|
数组种类数
我们可以选择操作b1或者bn+1,
选择bn+1好了,这时候我们每次的加减1可以包含进去b1也可以不包含
所以b1的取值有abs|pos-neg|+1种
代码细节
- min(pos, neg)+abs|pos-neg|=max(pos, neg)
- 用longlong防止爆int
c++代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int b[N], a[N];
long long pos, neg;
int main(){
int n;
cin >> n;
for(int i = 1;i <= n;i++){
cin >> a[i];
b[i] = a[i] - a[i - 1];
}
for(int i = 2;i <= n;i ++){
if(b[i] > 0) pos += b[i];
else neg -= b[i];
}
cout << max(pos, neg) << endl;
cout << abs(pos - neg) + 1;
}