代码拉取完成,页面将自动刷新
<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>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。