zoukankan      html  css  js  c++  java
  • 差分数组

    先来看一道例题,给定一个长度为n(n≤107)的数列{a1,a2,…,an},初始状态为0m(m≤107)次操作,每次可以选择一个区间[l,r],使下标在这个区间内的数都加k或者都减k,求这m次操作每一个数的最后结果。(原创?)

    O(n×m)暴力应该很好想,对叭~

    但是呢?数据范围就是这样的不友好,怎么办?


     这时候就要引入一个新的概念:差分数组

    首先我们先来定义一下这个数组:

    对于给定的数列A,它的差分数组B定义为:B[1]=A[1],B[i]=A[i]-A[i-1](2≤i≤n)

    容易发现“前缀和数组”和“差分数组”存在着互逆运算关系,在此就不再赘述,感兴趣的大佬可以自行研究。

    那么,把序列A的区间[l,r]k(即把Al,Al+1,…,Ar都加上k),其差分数组B的变化为Bl加k,Br+1k,其他位置不变。

    可以感性的理解为,第l位比第l-1大了k,而因为加上了这个k所以第r+1位会比第r位小k,所以需要减去。

    统计答案时,我们只需要把这个差分数组相加即可,因为差分数组的前缀和数组即为原序列(一定注意B[1]=A[1])。

    每次操作时间复杂度O(1)

    总时间复杂度O(n+m)


    rp++

  • 相关阅读:
    《HTTP 权威指南》笔记:第十二章 基本认证体制
    os模块,序列化模块
    常用模块,时间模块,sys模块
    random模块
    re模块
    正则表达式
    模块和包
    内置方法及模块初识,set的hash算法面试题
    fromkeys,eval,join的使用
    反射及内置方法
  • 原文地址:https://www.cnblogs.com/wzc521/p/11032190.html
Copyright © 2011-2022 走看看