线段树分裂 学习笔记
过程
线段树分裂是线段树合并的逆操作,即将一个区间信息分裂到新的树中,新的树一般需要新建。
注意当分裂和合并都存在时,我们在合并的时候必须回收节点,以避免分裂时会可能出现节点重复占用的问题。
时间复杂度显然 \(\mathcal{O}(\log n)\)。
实现
//将 x 分裂出 [p, q] 到 now 上
void split(int &x, int &now, int l, int r, int p, int q){
if (!x) {
return;
}
if (p <= l && r <= q) {
now = x;
x = 0;
return;
}
if (!now) {
New(now);
}
int mid = l + r >> 1;
if (p <= mid) {
split(s[x].l, s[now].l, l, mid, p, q);
}
if (q > mid) {
split(s[x].r, s[now].r, mid + 1, r, p, q);
}
pushup(x), pushup(now);
}
标签:
数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!