给定一个长度为 nn 的数列 a1,a2,…,ana1,a2,…,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。
求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。
输入格式
第一行输入正整数nn。
接下来nn行,每行输入一个整数,第i+1行的整数代表aiai。
输出格式
第一行输出最少操作次数。
第二行输出最终能得到多少种结果。
数据范围
0<n≤1050<n≤105,
0≤ai<21474836480≤ai<2147483648
输入样例:
输出样例:
分析:
首先,先对数组a差分一下,求出差分数组b,接下来我们的任务就是对b[2~n]全部变成0(所有的数和b[1]=a[1]一样)即可,b[i]+=d,b[j+1]-=d相当于将[i,j]都加上d。
我们对差分序列b直接操作的,因为一个++,一个--,所以我们在2~n之间要选择一个正数一个负数,一个--,一个++,这样就可以尽可能较少操作步骤,剩下的就和b[1]或者b[n+1]抵消(不影响整体结果)。
p为b当中正数的和
q为b当中负数绝对值的和
操作步骤=min(p,q)+abs(p-q)=max(p,q)
因为最后可以选择b[1]或者b[n+1]抵消,
比如b=1 0 2 0
他可以有
3 0 0 0(全部和b[1]消除)
2 0 0 0 (一个b[1],一个bn+1)
1 0 0 0(全部bn+1)
结果数量=abs(p-q)+1