前略
线段树(以下简称ST)这种高端大气上档次的东西,用法和树状数组(以下简称BIT)一样非常灵活,一个简单比较如下:
- ST和BIT都要求运算符能够支持交换律结合律。由于ST可以真正细化到每一个子区间,所以满足区间减法的运算符也可以在线段树上跑,但是BIT就不行。所以,一般来说BIT不支持与或非和最值运算符。
- 对于高维扩展,BIT的优势实在是致命性的,时空+编码复杂度甩ST几条大街。
- 但是基本操作上面,BIT的insert和query不能同时支持区间操作很是拙计。虽然有用两个BIT同时实现两个区间操作的方法,但是实现过程略麻烦细节略多容易抽,所以在不严格卡时空的题上面一般不用。ST能同时做到也是付出了空间消耗至少为BIT两倍(实际是大于len(L,R)的最大2的幂次)的代价,实现细节同样也较多,在一些题目中需要精心设计add,down,up这类辅助函数来合并拆分区间传递维护恰如其分的lazy。ST的核心思想是二分+lazy,把事情推到最后迫不得已恰到好处的时候再做,不提早(否则TLE),不推迟(否则WA)。
- 直接挂在树上的二分查找来看,BIT实现起来较为简单但是思维难度略高,但是由于区间减法的原因,对于能否二分限制很大,通常对于不满足区间减法的运算符就只能采用固定起点打死不用减法的办法来妥协了。ST的话虽然可以自主决定去不去左右子树,但是两边子树存在前后关联的时候每一步都要处理(单独传递记录状态和目标的变量,比如2013年成都网络预选赛J题),这是容易忘记的一步。