可以向我展示一份线段树的代码吗
以下是一个简单的线段树实现,用于区间求和:
#include <iostream>
using namespace std;
const int MAXN = 100005;
int n, m;
int a[MAXN]; // 存储原数组
int t[MAXN << 2]; // 线段树节点
void build(int p, int l, int r) {
if (l == r) {
t[p] = a[l];
return;
}
int mid = (l + r) >> 1;
build(p << 1, l, mid);
build(p << 1 | 1, mid + 1, r);
t[p] = t[p << 1] + t[p << 1 | 1];
}
int query(int p, int l, int r, int ql, int qr) {
if (ql > r || qr < l) {
return 0;
}
if (ql <= l && r <= qr) {
return t[p];
}
int mid = (l + r) >> 1;
return query(p << 1, l, mid, ql, qr) + query(p << 1 | 1, mid + 1, r, ql, qr);
}
void modify(int p, int l, int r, int pos, int val) {
if (l == r) {
t[p] = val;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) {
modify(p << 1, l, mid, pos, val);
} else {
modify(p << 1 | 1, mid + 1, r, pos, val);
}
t[p] = t[p << 1] + t[p << 1 | 1];
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
build(1, 1, n);
while (m--) {
int op, x, y;
cin >> op >> x >> y;
if (op == 1) {
modify(1, 1, n, x, y);
} else {
cout << query(1, 1, n, x, y) << endl;
}
}
return 0;
}
该代码实现了线段树的三个基本操作:建树、区间查询和单点修改。其中,建树操作通过递归实现,查询和修改操作则通过递归地访问线段树中的节点实现。
原文地址: https://www.cveoy.top/t/topic/b0JD 著作权归作者所有。请勿转载和采集!