线段树入门(汇总)

  • 标签:线段树

这篇文章主要内容主要来自 NotOnlySuccess 大神若干年前博客中的博文 《【完全版】线段树》,由于时间有些久远,现在已经找不到大神的原博文了,所以整理了一些网上的资料,在这里还原一下。

代码风格

  • maxn 是题目给的最大区间,而节点数要开4倍,确切来说节点数要开大于 maxn 的最小 \(2_x\) 的两倍;
  • lsonrson 分别表示节点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定义比较方便地表示;
  • 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

区间合并

暂无。

扫描线

暂无。

猜你喜欢

转载自www.cnblogs.com/codedecision/p/11687537.html