昨天的比赛,学长出了一道动态开点线段树的题,但是我动态开点理解的不是太深刻,导致没刚出来。其实看似那题cf2300分
,但如果熟悉动态开点,那题其实就是模板题,没有什么思维含量。
普通线段树和动态开点线段树
如果用普通线段树的思维去想动态开点的线段树,呢么你就大错特错了,普通线段树的区间信息存在于节点的信息中,可以被明确的表示出来,所以你在开空间的时候,你需要把整棵树的空间都开出来,因为你需要用节点去表示,所以,如果你要表示很大的空间就会超内存。
举个栗子:
我们要表示这个区间,则对于普通线段树肯定有
tr[k].l=1e9,tr[k].r=1e9
很显然对于普通线段树这颗满二叉树来说,空间肯定就爆了
而动态开点线段树它的节点并不含真的区间信息,它其实利用了节点在树中的位置对应的区间来表示区间信息,这样我们就可以在这个序列的满二叉上找位置开我们想要的节点,我们只需要按方向去递归即可,这样对于范围大但内存不大的线段树来说,十分的节省空间,可以说动态开点线段树是一颗残树,但树上的点都是有用的,所以我们开出有用的点,只对有用的点进行操作即可满足题意,也不爆空间