- 标签:线段树
这篇文章主要内容主要来自 NotOnlySuccess 大神若干年前博客中的博文 《【完全版】线段树》,由于时间有些久远,现在已经找不到大神的原博文了,所以整理了一些网上的资料,在这里还原一下。
代码风格
maxn
是题目给的最大区间,而节点数要开4倍,确切来说节点数要开大于 maxn 的最小 (2_x) 的两倍;lson
和rson
分别表示节点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定义比较方便地表示;push_up(int rt)
是把当前节点的信息更新到父节点;push_down(int rt)
是把当前节点的信息更新给儿子节点;rt
表示当前子树的根(root),也就是当前所在的节点。
题型分类
- 单点更新 :最最基础的线段树,只更新叶子节点,然后把信息用
push_up(int rt)
这个函数更新上来; - 成段更新 :(通常这对初学者来说是一道坎)需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新 or 询问到的时候;
- 区间合并 :这类题目会询问区间中满足条件的连续最长区间,所以
push_up
的手需要对左右儿子的区间进行合并; - 扫描线 :这类题目需要将一些操作排序,然后从左到右用一根扫描线(当然是我们脑子里)扫过去,最简单的就是矩形面积并,周长并等问题。
单点更新
https://www.cnblogs.com/codedecision/p/11676957.html
成段更新
https://www.cnblogs.com/codedecision/p/11687527.html
区间合并
暂无。
扫描线
暂无。