帮我用C++写一个线段树实现区间加和区间查询
时间: 2024-12-12 18:31:10 浏览: 12
线段树是一种数据结构,常用于高效地支持区间查询和修改操作,它通过对数组进行分治处理,使得查询和更新的时间复杂度可以达到对数级别。以下是使用C++实现一个基本的二叉线段树(Segment Tree)用于区间加法和查询的示例:
```cpp
#include <iostream>
#include <vector>
struct SegmentTree {
std::vector<int> tree;
int n;
// 初始化函数
SegmentTree(int size) : n(size), tree(2 * size) {}
// 向线段树中添加元素
void update(int idx, int val) {
idx += n; // 把索引转换到对应的非空节点
tree[idx] = val;
while (idx > 0) {
idx >>= 1; // 将左孩子变为父节点,右孩子保持不变
tree[idx] = tree[idx << 1] + tree[idx << 1 | 1];
}
}
// 查询指定区间的和
int query(int left, int right) {
int res = 0;
for (left += n, right += n; left <= right; left >>= 1, right >>= 1) {
if (left & 1) res += tree[left++];
if (right & 1) res += tree[--right];
}
return res;
}
};
int main() {
SegmentTree seg(5); // 创建一个大小为5的线段树
seg.update(1, 10); // 添加区间 [1, 1] 的值为10
seg.update(3, 20); // 添加区间 [3, 3] 的值为20
std::cout << "Sum of [1, 3]: " << seg.query(1, 3) << std::endl; // 输出:30
return 0;
}
```
在这个例子中,`update`函数负责将区间内的元素累加,而`query`函数则返回指定区间内所有元素的和。注意这个例子假设区间总是从左闭右开的,即包含起始位置而不包含结束位置。
阅读全文