可持久化数据结构
历史版本修改和查询,每一次操作生成一个历史版本。
知道可持久化思想就不难了。
大概就是对于每一个点可以丢到线段树上的叶子节点。
然后对于每一个历史版本,确定了根和每一个节点的左右节点那就知道了整棵树。
所以可以直接拿一个 root
数组来作为历史版本的信息存储。
然后显而易见地,发现对于每一个修改操作都会修改不超过 $\log n$ 个点。
形式化地,就是修改了当前节点到根节点路径上的所有节点。
所有信息都可以合并一下,然后更新 root
节点。
大概就没了,时间复杂度和空间复杂度均为 $N \log N$(猜的
1 |
|
主席树入门题(?
这主席树还是静态的,那么我们可以乱搞了。
首先分块老哥靠边(
如果我们要找到区间第 $k$ 小那么是不是可以直接维护区间内某些值的个数
如果一段前缀某些数的个数和 $<k$ 那么可以直接遍历另外一半
所以直接想到了线段树的左儿子和右儿子 然后直接遍历搞
因为你这样显然是要建一个值域的是吧
然后因为值域你开不下啊,所以离散化一样,不改变相对关系
最后在询问值得时候代回去就可以了
重点是我们怎么维护前缀某些数个数和
你现在有一堆结构体 tree[N]
然后 $\forall \space 1 \le i \le n$,tree[i]
代表了一段前缀的信息
信息的具体处理方式可以参考这样:3 3 4 6 9 1 1 4 1
然后你离散化每一个位置维护的值就应该是其出现的次数
那么就变成这样了 3[1] 2[3] 2[4] 1[6] 1[9]
但是你每个前缀都建一颗线段树,时间复杂度抛开不说,你空间跑不了啊
然后发现每一个前缀都和前面处理的信息有极大的重复
所以参考上面的方法 直接共用一大堆节点,新建相当于 $\log N$ 了。
所以时间复杂度和空间复杂度都是 $N \log N$ 了。
1 |
|
tmp
维护的就是上述的根,然后常规处理。
好的,这些就是暂时的可持久化博客了。
Flag:树套树,懒标记专题,线性基,如果咕了 QQ 催我。