【线段树】线段树合并
使用场景
有多棵线段树,维护相同的区间 [1,n]
,通常是全职线段树,
每一棵线段树维护了区间内的最大值(区间元素和),
次单点修改,每次修改一棵线段树的位置为 的值, 次修改之后,所有线段树对应区间位置的权值相加,并维护区间最大值。
代码
inline int merge(int a, int b, int l, int r) { // 合并函数 merge , a 和 b 是相同位置的两棵线段树编号
if (a == 0 || b == 0) {
return a + b;
}
if (l == r) { // 叶子节点
tree[a].val += tree[b].val;
tree[a].pos = tree[a].val ? l : 0;
}
int mid = (l + r) >> 1;
lc(a) = merge(lc(a), lc(b), l, mid);
rc(a) = merge(rc(a), rc(b), mid + 1, r);
pushup(a, l, r);
return a;
}
例题
简要题意
- 给定一棵树
- 次操作,每次将一条路径{x,y}的每一个点发放一个 类型的物品
目标: 次操作后,每个点上数量最多的物品是哪一种?
解法
- 对于每个节点 ,开一个桶 统计 类物品的数量;
- 树上差分修改 条链, 个单点的值;
- 此操作后,求树上前缀和将差分数组 转化为原始数组 。
本文作者:SenGYi
本文链接:https://www.cnblogs.com/Sengyi/p/17047915.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步