1 Star 2 Fork 0

rlmnsk/算法与数据结构

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
SegTree.sublime-snippet 2.74 KB
一键复制 编辑 原始数据 按行查看 历史
rlmnsk 提交于 2023-11-08 05:20 . update SegTree.sublime-snippet.
<snippet>
<content><![CDATA[
struct Node {
int l, r;
int c, v;
};
class SegTree {
int N;
std::unique_ptr<Node[]> tr;
std::function<void(Node&, Node&, Node&)> pushup;
std::function<void(Node&, Node&)> update;
std::function<void(Node&)> queryNodeInit;
std::function<void(Node&)> afterUpdate;
void setval(const SegTree& segtree) {
N = segtree.N;
tr = std::unique_ptr<Node[]>(new Node[(N + 2) * 4]);
}
SegTree &operator=(const SegTree& segtree) {
setval(segtree);
return *this;
}
SegTree(const SegTree& segtree) {
setval(segtree);
}
void pushupNode(int x) {
pushup(tr[x], tr[x << 1], tr[x << 1 | 1]);
}
void pushdown(int x) {
if (!tr[x].c) return;
update(tr[x << 1], tr[x]);
update(tr[x << 1 | 1], tr[x]);
afterUpdate(tr[x]);
}
void build(int x, int l, int r) {
tr[x] = {l, r, 0, 0};
if (l == r) return;
int mid = (l + r) >> 1;
build(x << 1, l, mid);
build(x << 1 | 1, mid + 1, r);
pushupNode(x);
}
void modify(int x, int l, int r, Node val) {
if (tr[x].l >= l && tr[x].r <= r) {
update(tr[x], val);
return;
}
pushdown(x);
int mid = (tr[x].l + tr[x].r) >> 1;
if (l <= mid) modify(x << 1, l, r, val);
if (r > mid) modify(x << 1 | 1, l, r, val);
pushupNode(x);
}
Node query(int x, int l, int r) {
if (tr[x].l >= l && tr[x].r <= r) {
return tr[x];
}
pushdown(x);
int mid = (tr[x].l + tr[x].r) >> 1;
Node res, lson, rson;
queryNodeInit(res);
queryNodeInit(lson);
queryNodeInit(rson);
if (l <= mid) lson = query(x << 1, l, r);
if (r > mid) rson = query(x << 1 | 1, l, r);
pushup(res, lson, rson);
return res;
}
public:
~SegTree() = default;
// 定义线段树
SegTree(int n,
std::function<void(Node&, Node&)> update,
std::function<void(Node&)> afterUpdate,
std::function<void(Node&)> queryNodeInit,
std::function<void(Node&, Node&, Node&)> pushup)
: N(n), tr(std::unique_ptr<Node[]>(new Node[(N + 2) * 4])), pushup(pushup), update(update), queryNodeInit(queryNodeInit), afterUpdate(afterUpdate) {
}
// 构建线段树
void build() {
build(1, 1, N);
}
// 更新函数
void modify(int l, int r, Node val) {
assert(l <= r && l >= 0 && r <= N);
l++, r++;
modify(1, l, r, val);
}
// 查询函数
Node query(int l, int r) {
assert(l <= r && l >= 0 && r <= N);
l++, r++;
return query(1, l, r);
}
};
]]></content></snippet>
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/rlmnsk/algorithm-and-data-structure.git
git@gitee.com:rlmnsk/algorithm-and-data-structure.git
rlmnsk
algorithm-and-data-structure
算法与数据结构
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385