树套树-线段树套线段树

作用

可以解决矩阵区域修改问题。

实现

先按照行建立线段树,然后在行线段树的每个节点下再按照列建立线段树。以2*3的矩阵为例,如下:
树套树-线段树套线段树_第1张图片
我们称外层的为x树,内层的为y树。
1.单点修改
对于y树的修改,就和普通线段树一样,主要就是x树的修改稍有不同。
①当前x树节点是叶节点
修改这个x树节点所对应的y树,由于是单点修改,找到y树叶节点时,直接修改。
②当前x树节点不是叶节点
修改这个x树节点所对应的y树,同理找到y树叶节点,但是不能直接修改,而是要从当前x树的儿子所对应的y树的相同的叶节点更新上来(因为不仅y树是单点修改,x树也是),可能有点绕,画个图:
树套树-线段树套线段树_第2张图片
因为每棵y树结构一样,所以就可以较方便实现更新(一般用完全二叉树法存线段树套线段树,不用链式存,因为链式找不同x树的相同y树节点有点麻烦,但不是不可以,留给读者自己思考啦)。
2.查询
查询就很简单了,由于修改时节点信息都修正过了,所以和普通线段树一模一样。

ps:多行修改很难实现,因为x树的Lazy-tag是区间,无法合并。

模板题

HDU4819,题解传送门。

你可能感兴趣的:(树套树,算法&数据结构总结By_ZZK)