1.线段树处理什么问题?
线段树主要处理区间的元素修改和查找问题,比树状数组适用范围广,但常数较大;
2.线段树是什么?
线段树,是由线段组成的树?是,但不准确。
我们看一下他解决的问题,你会发现,用暴力的话,时间复杂度大概是O(n*q);
很显然,这样的复杂度在提高组中是不被允许的,所以我们急需一种更为高效的算法。
于是,线段树横空出世!(此处应有掌声......)
观察暴力思路,我们发现,时间主要是浪费在枚举上。
我们需要考虑的是区间,而暴力则必须一个一个元素的处理,所以,我们可以建一棵代表一段区间的树,进行区间元素的处理。我们称之,线段树。
3.线段树怎么实现?
首先,我们考虑一段数列:
我们假设其为:1 2 3 4 5 5 6;
我们要将第一个到第5个加1,怎么做?
我们可以先将一棵树,根节点为1至n(n为元素个数)
然后将这个区间二分,分为左右两个区间,左节点为左区间,右节点为右区间。这样一直分下去,直到不可分为止。(图见教材)
这样,我们就得到了一颗线段树。
当我们要修改某个区间值时,我们只需修该被它包含的最大节点(即最前节点,因为此节点区间包含它的子树所包含的所有区间,所以不用向下考虑)的值即可。就像1至5,可将其分为1至3,4至5,只需修改两次即可。
由线段树的构建方法可知,每一个区间都可以这样完全划分。所以此算法正确。
那么,只这样修改后,如果我们需要调用他的子树怎么办?他的子树没有更新呀!要是我们每修改一次就更新它的子树,就太慢了。所以,我们用一个lazy标记,
显示他的子树需要被更新,及其数值,然后,我们就可以一边查找,一边更新了。
关于多重线段树,呵呵,自己看吧,我的手好不想被一篇博客废掉(微笑)