给我一份树状数组的代码
时间: 2024-02-01 08:36:18 浏览: 22
好的,以下是一份树状数组的Python代码示例:
```python
class FenwickTree:
def __init__(self, n):
self.n = n
self.tree = [0] * (n + 1)
def add(self, i, v):
i += 1
while i <= self.n:
self.tree[i] += v
i += i & -i
def sum(self, i):
res = 0
i += 1
while i > 0:
res += self.tree[i]
i -= i & -i
return res
```
这个类实现了树状数组的功能,可以用来快速计算区间和等操作。需要注意的是,这个示例使用的是 Python 语言编写的,如果要在其他语言中使用,需要进行相应的语言转换。
相关问题
帮我写一个树状数组模板
好的,以下是树状数组的模板:
树状数组是一种用于高效维护前缀和(或区间和)的数据结构,支持单点修改和区间查询。下面是树状数组的模板实现。
```python
class FenwickTree:
def __init__(self, n):
self.n = n
self.tree = [0] * (n + 1)
def lowbit(self, x):
return x & -x
def update(self, i, delta):
while i <= self.n:
self.tree[i] += delta
i += self.lowbit(i)
def query(self, i):
res = 0
while i > 0:
res += self.tree[i]
i -= self.lowbit(i)
return res
```
其中,`n` 表示树状数组的元素个数,`tree` 是存储前缀和的数组,`lowbit(x)` 函数用于计算 `x` 的最后一位 `1` 所代表的值,`update(i, delta)` 用于单点修改第 `i` 个元素的值,`delta` 表示增量,`query(i)` 用于查询前 `i` 个元素的和。
使用树状数组的时间复杂度为 $O(\log n)$。
树形数组模板代码及其注释
//树形数组
//树形数组是一种数据结构,可以用来高效地维护数组的前缀和,支持单点修改和区间查询
//树形数组的操作时间复杂度为O(logN),比线性的暴力算法要快很多
#include <iostream>
#include <vector>
using namespace std;
//树形数组的实现
class FenwickTree {
public:
FenwickTree(int n) {
tree.resize(n + 1); //树形数组的大小为n+1
}
//单点修改,将i位置上的值加上val
void update(int i, int val) {
while (i < tree.size()) {
tree[i] += val; //更新树形数组的值
i += lowbit(i); //更新i的值
}
}
//区间查询,查询区间[1, i]上的和
int query(int i) {
int sum = 0;
while (i > 0) {
sum += tree[i]; //累加区间[1, i]上的和
i -= lowbit(i); //更新i的值
}
return sum;
}
private:
vector<int> tree; //树形数组
//lowbit函数用于计算一个数的二进制表示中的最低位1所代表的值
int lowbit(int x) {
return x & -x;
}
};
int main() {
int n;
cin >> n;
FenwickTree tree(n); //创建一个大小为n的树形数组
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
tree.update(i, x); //将第i个位置上的值设置为x
}
int q;
cin >> q;
while (q--) {
int op, x, y;
cin >> op >> x >> y;
if (op == 1) {
tree.update(x, y); //将第x个位置上的值加上y
} else {
cout << tree.query(y) - tree.query(x - 1) << endl; //查询区间[x, y]上的和
}
}
return 0;
}