当需要向下递归时,先 pushdown,将之前的信息下放;然后对于一个儿子,如果需要往下走,那就走;否则,意味着操作区间不和这个儿子有交,那就是对这个儿子执行“不操作”的操作,那就是更新一下这个儿子的历史和sumh[son] += sum[son],然后把儿子的tagtag序列尾复制一个接上去,即tag[son][curtag[son]]++ ...
查询maxi=lrai(区间最值) 查询maxi=lrbi(历史最值) ∀i∈[l,r],ai←ai+v(区间修改) ∀i∈[l,r],ai←v(区间覆盖) Solution 先只考虑修改操作。对于一个节点(最大值v,历史最大值h),影响到它的操作像是一个队列: add1,add2,⋯,addk 想象逐个处理这些操作的过程。当处理到操作i的时候,这个节...
add2_:次大值历史最大加。 条件1:维护区间和,并且维护加法懒标记即可实现区间加法 条件2:使区间每个值变成min(当前值,v)。懒标记比较难实现精准的单点取最小值,但是如果仅是查询区间求和,可以通过维护最大值,次大值,最大值的个数,区间和,加法懒标记这几个元素来实现 首先对于区间取最小值,有三种情况: 1....
可持久化的线段树,又叫主席树。其思想大概就如图。在每一步的线段树操作后将改变的那一条链给单独拎出来,然后新建一次链,而没有改变的链就不动,再将新链与不动的那部分重新组合一下,就成了。 直接看模板裸题吧https://www.luogu.org/problemnew/show/P3919 #include<bits/stdc++.h>usingnamespacestd; typ...
线段树维护区间历史版本和 问题# 一个数列,支持区间加、查询区间和、查询区间历史版本和。 解法一# 设t为当前时间,hi为ai的历史版本和,维护一个值ci=hi−t⋅ai。 一个把[l,r]加上v的区间加操作,发现对于i∈[l,r],ci←ci−t⋅v(这里的t是操作之前的时间)。于是ci也用区间加维护即可。
线段树与历史最值问题 P4314 CPU 监控 Description 给定数组{ai},维护以下操作。定义一个辅助数组{bi},每次操作完后令bi=max(ai,bi)。 查询maxi=lrai(区间最值) 查询maxi=lrbi(历史最值) ∀i∈[l,r],ai←ai+v(区间修改) ∀i∈[l,r],ai←v(区间覆盖) ...
线段树维护区间历史版本和 问题# 一个数列,支持区间加、查询区间和、查询区间历史版本和。 解法一# 设t为当前时间,hi为ai的历史版本和,维护一个值ci=hi−t⋅ai。 一个把[l,r]加上v的区间加操作,发现对于i∈[l,r],ci←ci−t⋅v(这里的t是操作之前的时间)。于是ci也用区间加维护即可。