这几天主要是把树状数组的文章看完,外加部分线段树文章。
树状数组的理解:用于数组快速单点修改,和快速区间求和;查询和修改的时间复杂度都为log(n),空间复杂度为log(n)。
树状数组一般包含两个操作:更新和查询。更新元素需注意的是更新的是树状数组而不是初始数组;查询过程相当于是求前缀和的过程,有了前缀和,就可以通过前缀和的作差得到其中部分区间和的答案。
二维树状数组:存储规律和一维相同,只需在单点修改和区间查询的操作中在套用一个循环。
假设初始二维序列是nu[n][m],二维树状树状数组是tree[n][m],那么tree[x][y]存的是二维初始序列中右下角为nu[x][y],宽lowerbit(y),高为lowerbit(x)的子区间的区间和。
另外树状数组可与二分连用,感觉比较好,但只能处理下标从1开始的问题。
对于线段树:用链表和数组都可存储。把大区间分为若干个不相交的区间,每次维护都在小区间上处理,并且查询也在这些被分解的区间中信息合并出我们需要的结果,这就是线段树高效的原因。
对于线段树类的题这周就看了两道,还应注意效率和时间安排。