一般的模板:区间加乘改,求区间极大 / 极小 / 和
线段树模板 1:区间加,求区间和 / 最大 / 最小
区间里的元素如果逐个修改就太慢了,所以考虑更快的方式——“懒惰标记”。
对于一个区间,只需要在下传时,遇到一个完整区间就标记并退出,并对走过的区间进行懒标记。
查询的时候,再在求和之前把懒标记加回来,就可以实现求和。
线段树模板 2:区间加,区间乘,求区间和 / 最大 / 最小
对于这种情况,标记下传的操作需要进行修改。
原来,做一次加法只需要这个区间的和懒标记加上这个值,并且让这个区间的求和数组加上这个数的值*区间长度。
但是现在,又多了一个乘法懒标记,在实现区间加、区间乘操作时会麻烦一些:
-
- 乘法懒标记数组清空时要赋值 1;
- 区间加时,不用任何改动;
- 区间乘时,不仅求和数组和乘法懒标记要乘上这个数,连加法懒标记也要乘上它才可以。
线段树模板 3:区间加,区间改,求区间和 / 最大 / 最小
区间改可以无视之前做过的任何操作,所以区间改时所有的懒惰标记都要改,当修改懒标记没有存储数时,最好存 -1 或不出现的数。