线段树模板题
2026-10-30 22:36:38
发布于:江苏
21阅读
0回复
0点赞
这道题需要实现区间求和( 个数),所以可以使用线段树维护,注意开 倍空间并准确写出建树、查询函数即可。
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int N = 5e5 + 10;
struct node {
int l, r, v;
};
int n, m;
int a[N];
node tree[4 * N];
void build (int p, int l, int r) {
tree[p].l = l;
tree[p].r = r;
if (l == r) {
tree[p].v = a[l];
return;
}
int mid = (l + r) / 2;
build(p * 2, l, mid);
build(p * 2 + 1, mid + 1, r);
tree[p].v = tree[p * 2].v + tree[p * 2 + 1].v;
}
void update (int p, int x, int z) {
if (tree[p].l == tree[p].r) {
tree[p].v += z;
return;
}
int mid = (tree[p].l + tree[p].r) / 2;
if (x <= mid) update(p * 2, x, z);
else if (x > mid) {
update(p * 2 + 1, x, z);
}
tree[p].v = tree[p * 2].v + tree[p * 2 + 1].v;
}
int query (int p, int x, int y) {
if (x <= tree[p].l && tree[p].r <= y) {
return tree[p].v;
}
int mid = (tree[p].l + tree[p].r) / 2;
int ans = 0;
if (x <= mid) ans += query(p * 2, x, y);
if (y > mid) ans += query(p * 2 + 1, x, y);
return ans;
}
signed main() {
for (int i = 1; i <= 2; i++) cin >> a[i];
build(1, 1, 2);
cout << query(1, 1, 2) << '\n';
return 0;
}
不会真的有人这么写吧
全部评论 2
线段树模板我不太会。
2天前 来自 广东
0厉害!
2天前 来自 广东
0
















有帮助,赞一个