线段树区间修改(减少)c++代码
时间: 2024-11-24 09:26:22 浏览: 7
线段树,也叫区间树,是一种数据结构,常用于处理区间查询和更新的问题。对于区间修改(减少),在线段树中,我们通常会维护每个节点代表一段连续区间的值,并对整棵树进行递归操作,使得每次修改都能保持叶子节点(最小子区间)的新值。
以下是一个简单的C++代码示例,假设我们有一个二维数组`arr`,我们需要支持减少区间内的元素:
```cpp
#include <iostream>
#include <vector>
using namespace std;
class SegmentTree {
private:
vector<int> tree;
int n; // 数组长度
public:
SegmentTree(vector<int>& arr) {
n = arr.size();
tree.resize(4 * n);
build(arr, 0, 0, n - 1);
}
void build(vector<int>& arr, int node, int start, int end) {
if (start == end) {
tree[node] = arr[start];
} else {
int mid = (start + end) / 2;
build(arr, 2 * node + 1, start, mid);
build(arr, 2 * node + 2, mid + 1, end);
tree[node] = tree[2 * node + 1] + tree[2 * node + 2];
}
}
void update(int l, int r, int val) { // 减少区间[l, r)
update(0, 0, n - 1, l, r, -val);
}
private:
void update(int node, int start, int end, int l, int r, int val) {
if (l > end || r < start) return;
if (l <= start && r >= end) {
tree[node] += val;
} else {
int mid = (start + end) / 2;
update(2 * node + 1, start, mid, l, r, val);
update(2 * node + 2, mid + 1, end, l, r, val);
tree[node] = tree[2 * node + 1] + tree[2 * node + 2];
}
}
int query(int node, int start, int end, int idx) const {
// 返回第idx小的元素...
} // 根据实际需求实现查询函数
};
int main() {
vector<int> arr = {1, 2, 3, 4, 5};
SegmentTree segTree(arr);
// 示例:减少区间 [2, 4),新值为-2
segTree.update(2, 4, -2);
return 0;
}
```
在这个例子中,`update`函数接受一个左边界`l`、右边界`r`和新的值`val`,然后递归地更新线段树。注意这只是一个简化版的实现,实际应用中还需要处理查询功能以及一些边界情况。
阅读全文