树状数组
概念
树状数组 (Binary Indexed Tree(BIT)也称作(Fenwick Tree) 是一个区间查询和单点修改复杂度都为log(n)的数据结构。主要用于查询任意两点之间的所有元素之和。
例题:一维树状数组 1 :单点修改,区间查询
【模板】树状数组 1(洛谷)
树状数组 1 :单点修改,区间查询(Liuser’s OJ)
题目
题目描述
如题,已知一个数列,你需要进行下面两种操作:
- 将某一个数加上 x
- 求出某区间每一个数的和
输入格式
第一行包含两个正整数 n,m ,分别表示该数列数字的个数和操作的总个数。
第二行包含 n 个用空格分隔的整数,其中第 i 个数字表示数列第 i 项的初始值。
接下来 m 行每行包含 3 个整数,表示一个操作,具体如下:
- 含义:将第 x 个数加上 k
1 x k
- 含义:输出区间 [x,y] 内每个数的和
2 x y
输出格式
输出包含若干行整数,即为所有操作 2 的结果。
样例
样例1输入
5 5
1 5 4 2 3
1 1 3
2 2 5
1 3 -1
1 4 2
2 1 4
样例1输出
14
16
数据范围
对于100%的数据,1≤n,m≤5×10^5。
分析
这道题的 常见做法:
for(long long i=x;i<=y;i++)
{
ans+=a[i];
}
//用for循环从区间x到y依次求和,时间复杂度:O(n) 。
缺点:当数据规模极大的时候,将会变得效率低下,容易超时。
这时,我们想到了 前缀和:
//原数组为A[i],再定义一个数组B[i],i≤n+5。
B[1]=A[1