没啥会的东西 先从线段树开始复习..
利用二叉树的性质 节点保存区间信息
标记下传实现的是查的有多深就更新信息到哪里 尽量停留在区间层面 不然单次区间修改就是O(N)
没看到过懒标记的复杂度严格分析 不过也得看询问的情况 酱紫搞期望logn
线段树1
递归建树
|
线段树2
显然需要开两个懒标记$add[N]$, $mul[N]$
考虑这么区间$[1,3]$,先给第一个节点$+2$,那么$seg[1]$+=$(3-1+1) * 2$,$add[1]$+=$2$
然后再令节点 $1$ 乘 $4$,那么$seg[1]$ = $4$ , $mul[1]$=$4$
再次给节点一$+3$的时候就有问题了,如果还是直接更新这个$seg$和$add$,显然是不对的做法
所以我们点修的选择有两种,一种是先加后乘,对于新来的$add $,如果$mul>1$,那么先令add\mul,最后统计贡献的时候会乘回来,这样运算顺序是对的,但是这种方式会有精度丢失,不好用
那么就考虑先乘后加,每次得到一个$mul$,如果有$add$,把这个$mul$的贡献给$add$也算一遍,这样再来$add$的时候就可以直接+=了
// Where does Mongolia Top Come From ? |
权值线段树
把维护的区间下标改成值域 维护的就可以是类似桶的东西
单次操作的复杂度就是$log_len$,$len$表示最大的权值
支持第k大 查询排名的动态维护
理解是好理解 码量其实也不小(对我这种手残玩家来说挺长的)
不过题目可能不会刻意设置权值范围 如果正常1e9肯定炸空间
以普通平衡树的模板
这种时候 要么动态开点 时空复杂度一般$O(M\ log_{2}{len}$) 不卡log的话一般不会寄
要么离散化一下 要么完蛋
先来份动态开点的
线段树动态开点就是用变量保存下标位置 哪里要用节点哪里建立 整个数组当内存池就行了
version 动态开点
|
Version 离散化
离散化的话就要求离线了。。
|
可持久化线段树
未完待咕..