初步线段树
——HM
线段树是竞赛常用的数据结构,实在不会什么算法(比如我),用线段树暴力打一遍,一般都能有40~60的分数,这至少能让你上省二了。下面来讲一下建好树后的一些常规操作。
1、区间修改
将一列数的某一段区间加上一个数,若模拟则时间复杂度为O(n),很慢。若用线段树则很快了。
如下图:

图片来自互联网
一棵线段树建成了,表示一个长度为10的数组。如要使区间[1,6]上每个数加上x,则可以将上图中“1,5”号节点与“6,6”号节点打上标记表示这一区间加上了x。当向上归并时加上标记值,因为遍历时与归并时最多两次遍历一遍整个树,去掉常数后一遍修改时间复杂度最大为O(logN),远优于模拟的O(N)。
我们可能会发现这里修改的过程有点类似于差分,但其实优于差分,因为其充分利用了分块的思想,将一件事分开去做,变快了许多。
下面列举一些基本的线段树操作:
一、单值修改
很遗憾,线段树中的单值修改比数组操作中要慢,比如将第5个数改为某个值,在数组中只要将a[5]改为这个值就行了,时间复杂度为O(1),而线段树中则要将每一层的含a[5]的区间 ,复杂度为O(logn)。具体操作会在下面的区间修改中提及。
二、区间修改
线段树的区间修改时时间复杂度就远优于常规数组操作了。主要的操作有区间加或区间乘。如直接按照线段树的结构进行逐层累加/乘时间复杂度与数组操作相比没有任何优势(甚至更慢),此时我们需要一个标记将除需要查询的区间以外的使用一个标记保存(lazy tag),只需计算这个区间的真实值即可,于是复杂度变为了nlogn,远优于n^2。
线段树是一种高效的数据结构,常用于处理区间查询与修改问题。通过区间修改,如区间加法或乘法,可以将操作时间复杂度降低到O(logN)。线段树利用分块思想,避免了全数组遍历,从而提高效率。此外,通过标记(lazytag)可以进一步优化区间修改操作,使其在复杂度上优于简单的数组操作。线段树在竞赛编程中尤其有用,即使不熟悉高级算法,也能通过它获得不错的分数。
5430

被折叠的 条评论
为什么被折叠?



