唔,从今天开始,每天整理两个知识点吧。
首先是今天的主角——线段树!在学习线段树之前,我已经学习过了优先队列并且学会了用堆来模拟数组,对于二叉树也有了一定的认识,正好今天来接触一下线段树。
接着是安利:
(HH学习线段树的心路历程)新手的话看看洛谷的模板题QAQ
(由于模板什么的都已经看好了,那么HH就在这里说说自己的理解吧)
线段树在我看来,是对一段连续的区间操作的工具。基本操作有:
1.建树:事实上是一个回溯的过程,就是先从上往下先建立好节点,但是不赋值,在递归回来的时候再赋值。(因为线段树储存的本身就是一段区间的和)
2.查询:这里的查询就是一个二分查找,注意这里跟赋值的时候刚好反过来,是从上往下找的(只是思维是这个样子
3.同时加:这里的加法可以用lazytag,就是在根节点上记录一个要改变的值,然后从上往下传递下去,真正加的时候就要算上区间长度;
4.乘法:和加法类似,注意这里要先乘后加(根据四则运算的法则),同时也要多一步的计算量。
唔,总之,学会了线段树,感觉又多了一个有力的武器,奇怪的信心增加了?(大雾)