差分

给定一个长度为 n ( n ≤ 1 0 5 ) n(n \leq 10^5 ) n(n105) 的数列 a 1 , a 2 , … , a n {a_1,a_2,…,a_n} a1,a2,,an ,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。
求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。
先差分, d 1 = a 1 , d n + 1 = − a n + 1 d_1=a_1, d_{n+1}=-a_{n+1} d1=a1,dn+1=an+1相当于每次取两个数,一个加一,一个减一,最后使得 d 2 = d 3 = ⋯ = d n = 0 d_2=d_3=\dots=d_n=0 d2=d3==dn=0
有下面四种操作:

  1. d i , d j d_i, d_j di,dj加减1,其中2<=i,j<=n
  2. d i , d n + 1 d_i, d_{n+1} di,dn+1加减1,其中2<=i<=n
  3. d n + 1 , d j d_{n+1}, d_j dn+1,dj加减1,其中2<=j<=n
  4. d 1 , d n + 1 d_1, d_{n+1} d1,dn+1加减1

4操作没用,为了次数最少,优先操作1,操作完了之后, d i d_i di>=0或 d i d_i di<=0
1操作完了之后,只能操作2/3,且操作次数为剩余的不为0的数的绝对值的和

你可能感兴趣的:(差分)