树状数组在区间求和问题上有很高的效率,尤其在非常困难的比赛中(数据量大,对时间限制很严格的比赛)能发挥非常大的作用,其各种复杂度都要比线段树低很多,而且其代码简洁优美……(好了我吹不下去了,赶紧开始)有关区间求和,主要有以下三个模型:
(以下设a[1…n]为一个长为n的序列,初始值全为0)
1、改点求段型:即对于序列A有以下操作:
- 求整段区间的和:给定i,计算a1+a2+…+ai
- 修改单点:给定x和c,执行ax += c
这是最容易的模型,使用bit[]树状数组就可以得到该答案:树状数组中不断进行前驱赋值就可以得到整个区间的和,对每个树状数组进行后继赋值就可以修改单点,复杂度都为log(n)。
//改点求段型
//原数组为a[1...n],树状数组为bit[1...n]
//操作【1】:ADD(x, c); 对a[x]加上c
//操作【2】:SUM(r)-SUM(l-1)。 计算sum(l,r)
int sum(int i)
{
int