树状数组方法介绍概要.doc

树状数组方法介绍概要

树状数组简介 一、前言 我们平日里总是会遇到一些动态的求和问题,一些朴素的方法时间速度上很难让人满意,因此我们需要设计一些算法来解决所遇到的问题。 基本问题 我们下面设法解决这个动态求和问题。 我们定义 N 个整型变量组成的数组 v[1..N],每次操作有两种: 将v[idx] 增加 det 求 朴素解决 朴素的解决这个问题,我们用数组记录当前的数值,然后依次求和。那么操作(1)的复杂度是 O(1),操作(2)的复杂度是 O(idx),令询问数为 Q ,则在最坏情况下为 O(QN)。 这样的复杂度非常不理想,我们要对之优化! 二、倍增,分割和优化 很多时候在处理区间问题的时候,倍增思想都是非常常用的,比如 RMQ和LCA问题,而分割方法也是一个有用的工具,比如线段树。 我们知道线段树是能够解决上面这个基本问题的,但是考虑到线段树的代码比较复杂,这里我们讨论更轻松的方法。 第一个想法 我们发现,在朴素算法中,操作(2)用了很多的时间,我们试着优化这个操作的算法。 参照RMQ的思想,我们可以将一个区间分成一些长度为2的整次幂的小区间。 我们定义f[i][j] 表示区间 [I, i+2^j-1] 的和,那么如果我们能够得到所有 f[i][j] ,那么我们就能够在 O(log N) 的时间里计算出我们需要的和。 具体方法如下: 对于区间 [L,R],我们找到最大的 p ,使得

文档评论(0)

1亿VIP精品文档

相关文档