一般的模板:区间加乘改,求区间极大 / 极小 / 和
线段树模板 1:区间加,求区间和 / 最大 / 最小
区间里的元素如果逐个修改就太慢了,所以考虑更快的方式——“懒惰标记”。
对于一个区间,只需要在下传时,遇到一个完整区间就标记并退出,并对走过的区间进行懒标记。
查询的时候,再在求和之前把懒标记加回来,就可以实现求和。
线段树模板 2:区间加,区间乘,求区间和 / 最大 / 最小
对于这种情况,标记下传的操作需要进行修改。
原来,做一次加法只需要这个区间的和懒标记加上这个值,并且让这个区间的求和数组加上这个数的值*区间长度。
但是现在,又多了一个乘法懒标记,在实现区间加、区间乘操作时会麻烦一些:
-
- 乘法懒标记数组清空时要赋值 1;
- 区间加时,不用任何改动;
- 区间乘时,不仅求和数组和乘法懒标记要乘上这个数,连加法懒标记也要乘上它才可以。
线段树模板 3:区间加,区间改,求区间和 / 最大 / 最小
区间改可以无视之前做过的任何操作,所以区间改时所有的懒惰标记都要改,当修改懒标记没有存储数时,最好存 -1 或不出现的数。
线段树趣题
① 01 数列区间异或,区间求和
区间异或其实也不会难,只需要碰到完整的区间时将整个区间的和改成区间长度 - 原区间和,其它类似于上面的题目。
② 线段树 + 数学内容
题意大致如下:
给定一个长度为 $n$ 的数列 $A_1,A_2,...,A_n$,有 $m$ 种操作,每次操作给出操作区间端点 $l,r$:
1. 随机打乱下标在 $[l,r]$ 之间的所有数的值;
2. 求 $\sum_{i=l}^r A_i$ 的期望值对 $10^9+7$ 取模。
解析:
观察 “打乱” 操作,因为是随机的,所以最后取出的每个数的期望值都是相同的。
但这串数的和是固定的,所以随机打乱后,每个数的期望值就是原区间的平均数。
这题求和时有模数,所以处理平均数时可以用逆元。
然后这题就变成了区间修改、区间求和的模板题。
来源:https://www.cnblogs.com/zengpeichen/p/12331917.html