Browse Source

Merge 17406865e5 into 7fd1a60b01

pull/10855/merge
aaa-aas 1 month ago committed by GitHub
parent
commit
d6f6320e54
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 3
      README
  2. 18
      main.cpp
  3. 76
      segment_tree.hpp
  4. BIN
      segment_tree_demo.exe

3
README

@ -1 +1,4 @@
Hello World!
2026/08/14

18
main.cpp

@ -0,0 +1,18 @@
#include <iostream>
#include <vector>
#include "segment_tree.hpp"
int main() {
std::vector<long long> arr = {1, 3, 5, 7, 9, 11};
SumSegmentTree st = make_sum_segment_tree(arr);
std::cout << "Sum of [1, 3]: " << st.query(1, 3) << '\n'; // 3 + 5 + 7 = 15
std::cout << "Sum of [0, 5]: " << st.query(0, 5) << '\n'; // 36
st.update(2, 10); // arr[2]: 5 -> 10
std::cout << "Sum of [1, 3] after update: " << st.query(1, 3) << '\n'; // 3 + 10 + 7 = 20
return 0;
}

76
segment_tree.hpp

@ -0,0 +1,76 @@
#pragma once
#include <functional>
#include <vector>
template <typename T, typename Op>
class SegmentTree {
public:
SegmentTree(const std::vector<T>& data, Op op, T identity)
: n_(static_cast<int>(data.size())),
op_(std::move(op)),
identity_(identity),
tree_(4 * n_, identity_) {
if (n_ > 0) {
build(data, 0, 0, n_ - 1);
}
}
T query(int left, int right) const {
return query(0, 0, n_ - 1, left, right);
}
void update(int index, T value) {
update(0, 0, n_ - 1, index, value);
}
private:
int n_;
Op op_;
T identity_;
std::vector<T> tree_;
void build(const std::vector<T>& data, int node, int start, int end) {
if (start == end) {
tree_[node] = data[start];
return;
}
int mid = start + (end - start) / 2;
build(data, 2 * node + 1, start, mid);
build(data, 2 * node + 2, mid + 1, end);
tree_[node] = op_(tree_[2 * node + 1], tree_[2 * node + 2]);
}
T query(int node, int start, int end, int left, int right) const {
if (right < start || end < left) {
return identity_;
}
if (left <= start && end <= right) {
return tree_[node];
}
int mid = start + (end - start) / 2;
return op_(
query(2 * node + 1, start, mid, left, right),
query(2 * node + 2, mid + 1, end, left, right));
}
void update(int node, int start, int end, int index, T value) {
if (start == end) {
tree_[node] = value;
return;
}
int mid = start + (end - start) / 2;
if (index <= mid) {
update(2 * node + 1, start, mid, index, value);
} else {
update(2 * node + 2, mid + 1, end, index, value);
}
tree_[node] = op_(tree_[2 * node + 1], tree_[2 * node + 2]);
}
};
using SumSegmentTree = SegmentTree<long long, std::plus<long long>>;
inline SumSegmentTree make_sum_segment_tree(const std::vector<long long>& data) {
return SumSegmentTree(data, std::plus<long long>{}, 0LL);
}

BIN
segment_tree_demo.exe

Binary file not shown.
Loading…
Cancel
Save