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)是方案数。

  • 相关阅读:
    罗马数字加法实现Roman Calculator
    etymology-E
    Unreal里的输入
    Laravel框架怎样使用阿里云ACE缓存服务
    log4j和logback会互相冲突
    log4j和logback会互相冲突
    log4j和logback会互相冲突
    log4j和logback会互相冲突
    在敏捷中应用测试驱动开发
    在敏捷中应用测试驱动开发
  • 原文地址:https://www.cnblogs.com/Miracevin/p/9676616.html
Copyright © 2011-2022 走看看