差分
什么是差分?写个公式就懂了
有数组a[1],a[2],a[3],a[4],a[5]…a[n]
差分b数组 b[i]=a[i]-a[i-1],即第i个数与第i-1个数的差
a[i]是b[i]的前缀和,可推导
接下来有个运用差分的列题:
100. 增减序列
算法分析:差分+贪心
思路:首先这题一个重点,就是区间[l,r][l,r]的修改操作。因为这道题目的修改操作有一个特性,就是只加一或者只减一,而不是+x,也不是−x,所以说我们并不需要用到高级的数据结构,线段树和树状数组,而只是需要用差分即可。
这题讲把a数组变为全部相同的数转化成讲差分b转化成0,代表所有数与a1相同;
求出差分中正数q的总值,负数p的总值,max(q,p)代表将所有差分转变成0最少需要max(q,p)步操作使得所有数与a1相同!!!
abs(q-p)+1代表最少步数情况下转化成为的数字可能性!!!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll cnt[N]={0};
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&cnt[i]);
for(int i=n;i>=2;i--) cnt[i]=cnt[i]-cnt[i-1];//差分
ll p=0,q=0;//p正数 q负数
for(int i=2;i<=n;i++){
if(cnt[i]>0) p+=cnt[i];
else q-=cnt[i];
}
printf("%lld\n%lld\n",max(q,p),abs(q-p)+1);
return 0;
}