摘要: 在解题过程中,我们有时需要维护一个数组的前缀和S[i]=A[1]+A[2]+...+A[i]。但是不难发现,如果我们修改了任意一个A[i],则S[i]、S[i+1]、...、S[n]都会发生变化。可以说,每次修改A[i]后,调整前缀和S[]在最坏情况下会需要O(n)的时间。当n非常大时,程序会运行得非常缓慢。因此,这里我们引入“树状数组”,它的修改与求和都是O(logn)的,效率非常高。树状数组的结构如下所示(注意数组下标从1开始,这点会影响到各函数的实现):对于每颗子树Cn,它表示A[i-2^k+1]到A[i]的和,而k则是i在二进制时末尾0的个数,或者说是i用2的幂方和表示时的最小指数。而 阅读全文
posted @ 2012-10-17 22:55 moonswap 阅读(128) 评论(0) 推荐(0) 编辑