zoukankan      html  css  js  c++  java
  • [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)是方案数。

  • 相关阅读:
    NOI2018:屠龙勇士
    Hello world!
    bzoj5月月赛订正
    codeforces906 D
    bzoj2728 [HNOI2012]与非
    bzoj3884上帝与集合的正确用法
    bzoj2817[ZJOI2012]波浪
    2017多校联合赛1[题解]
    论如何优雅的用bitset来求四维偏序
    bzoj1488[HNOI2009]图的同构
  • 原文地址:https://www.cnblogs.com/Miracevin/p/9676616.html
Copyright © 2011-2022 走看看