c/c++的线段树怎么写
时间: 2023-03-23 19:00:35 浏览: 115
线段树初步(C++)
C语言的线段树可以使用数组来实现,每个节点表示一个区间。以下是一个基本的线段树结构体及其相关函数的示例代码:
```c
const int MAXN = 100005; // 区间长度的最大值
struct SegTreeNode {
int l, r; // 区间左右端点
int sum; // 区间内元素的和(这里以求和为例)
// 构造函数
SegTreeNode() : l(0), r(0), sum(0) {}
// 复制构造函数
SegTreeNode(const SegTreeNode& o) : l(o.l), r(o.r), sum(o.sum) {}
};
SegTreeNode segTree[MAXN << 2]; // 线段树数组,使用区间长度的4倍大小
// 建立线段树(输入数组为a,当前节点为i,区间为[l, r])
void build(int i, int l, int r, int a[]) {
segTree[i].l = l;
segTree[i].r = r;
if (l == r) {
segTree[i].sum = a[l];
return;
}
int mid = (l + r) >> 1;
build(i << 1, l, mid, a);
build(i << 1 | 1, mid + 1, r, a);
segTree[i].sum = segTree[i << 1].sum + segTree[i << 1 | 1].sum;
}
// 区间查询(查询区间[qL, qR]的和,当前节点为i)
int query(int i, int qL, int qR) {
if (segTree[i].l >= qL && segTree[i].r <= qR) {
return segTree[i].sum;
}
int mid = (segTree[i].l + segTree[i].r) >> 1;
int res = 0;
if (qL <= mid) {
res += query(i << 1, qL, qR);
}
if (qR > mid) {
res += query(i << 1 | 1, qL, qR);
}
return res;
}
// 区间修改(将区间[pL, pR]加上x,当前节点为i)
void modify(int i, int pL, int pR, int x) {
if (segTree[i].l >= pL && segTree[i].r <= pR) {
segTree[i].sum += x;
return;
}
int mid = (segTree[i].l + segTree[i].r) >> 1;
if (pL <= mid) {
modify(i << 1, pL, pR, x);
}
if (pR > mid) {
modify(i << 1 | 1, pL, pR, x);
}
segTree[i].sum = segTree[i << 1].sum + segTree[i << 1 | 1].sum;
}
```
使用示例:
```c
#include <stdio.h>
int main() {
int n = 10;
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 建立线段树
build
阅读全文