周中训练笔记(二)
如果说上周我对树状数组的理解只有两岁的话,那么现在我感觉至少有十八岁了,上周六的时候把上面的公式验证了,有的并不明白什么意思,然后这周把群里的文件都打了出来看了好多遍,把零碎的知识点看了之后又重头捋了一遍,终于看透彻了,有一种豁然开朗的感觉,心情甚好,下面就把我的总结写出来。
数组a[]指的是原始数组,更改第i个元素的值和查询[x,y]的元素的和都是指的此数组。
数组c[]是利用一种非常巧妙的方法将a[]的一部分或者全部的值存进去。
数组sum[]是计算a[]和的数组。
首先来说一下数组c[]的起点的计算公式:上面提到了c[]是存a[]一个部分或者全部元素的数组,如果存部分元素的话必然有起点和终点。
起点计算公式:lowbit(x)=x&(-x)
c[x]的起点为a[x-lowbit(x)+1]终点为a[x]
即c[x]为a[x-lowbit(x)+1]一直累加到a[x]的和。
而且lowbit(x)函数设计的也很巧妙,这个函数算出来的结果总是这个数二进制的最右边一个1.
下面还有单点更新和区间求和问题,把我写的拍成照片发上来: