实现三个功能:
1 add:在l到r区间所有数加一个数
2 update:在l到r区间所有数更新成一个相同的数
3 query:得到l到r区间的和
一般add和update不会同时做,一般一次只需要一个功能。
思路:可以利用二分划分区间,类似多重背包,任何一个数,利用二进制,可以在logn找到它。线段树也是一样,利用二分可实现快速查找。
上图是一个满二叉树,需要2n-1个空间。但如果你的数组长度不是2的指数,其实是无法构成一颗满二叉树的。可能需要补几个元素,让他们为0.
满二叉树:一直一样的范围会分到底,假如是6,会一边有3个,不满足偶数,就会有少分的情况。
所需范围:对于一个任意的n,4n是最多所需的空间。扩充(至多扩充一倍),满二叉树又一倍,所以是四倍。
最不省空间:恰好为2的指数+1,后面需要全部补齐。。
建树及数据结构:数组
只需准备数组,然后保存好hash关系即可。
找孩子:从最大的范围开始,左孩子:2i,右孩子:2i+1,从1开始