[Poetize6] IncDec Sequence

题目描述

给定一个长度为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)是方案数。

posted @ 2018-09-19 19:44  *Miracle*  阅读(186)  评论(0编辑  收藏  举报