题目描述
给定一个长度为n的数列a1,a2,⋯,an每次可以选择一个区间[l,r]使这个区间内的数都加1或者都减1。
请问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。
题解
经典差分题目。
区间加减——>差分变成单点加减
每次一个位置+1,一个位置-1
广义差分,b[1]=a[1],b[i>2]=a[i]-a[i-1]
除b[1]要让所有都变成0
b[1]的种类数即为方案数。
为了使方案数最少,可以每次把负数点+1,正数点-1,改变为2
正数和p,负数和q(绝对值)
所以,消去正数、负数较少的那一个的操作次数就是min(p,q)
然后,正数、负数较多的那一个可能剩下。
假设正数剩的多,
那么现在实际上是一个阶梯形状,从左到右递增。
这个时候,为了保证次数最少,每次消除必然要使正数(设位置是pos)-1
那,哪个数+1呢?可以是b[1],象征对1~pos 区间+1,
可以是b[n+1]象征对pos~n区间-1
所以,每次选择可以多一个b[1],而且也能保证最少操作次数。
所以,ans=max(p,q)为答案。
ans-min(p,q)是方案数。