给定一个长度为 nn 的数列 a1,a2,…,ana1,a2,…,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。

求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。

输入格式

第一行输入正整数nn。

接下来nn行,每行输入一个整数,第i+1行的整数代表aiai。

输出格式

第一行输出最少操作次数。

第二行输出最终能得到多少种结果。

数据范围

0<n≤1050<n≤105,
0≤ai<21474836480≤ai<2147483648

输入样例:

4
1
1
2
2

输出样例:

1
2

 

分析:

首先,先对数组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
 

 

n=input()
N=100005
n=int(n)

a=[0 for i in range(0,n+1)]
b=[0 for i in range(0,n+1)]

for i in range(1,n+1):
a[i]=input()
a[i]=int(a[i])
b[1]=a[1]
p=0
q=0
for i in range(2,n+1):
b[i]=a[i]-a[i-1]
if(b[i]>0):
p+=b[i]
else:
q-=b[i]
print(max(p,q))
print(abs(p-q)+1)