原题链接: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 >&