[OI 算法总结] 线段树
线段树是一种维护区间信息的数据结构,普遍时间复杂度一次操作的时间复杂度为 \(\mathcal{O}(\log n)\)。
例题 \(1\):
给定一长为 \(n\) 的序列 \(a\),初始时 \(a_i=0\),现有 \(m\) 次操作,每次操作为以下两种之一:
1 pos val
:将 \(a_{pos}\) 加上 \(val\);
2 l r
: 求 \(\sum\limits_{i=l}^{r}a_i\).
发现可以使用树状数组。
这里介绍一下线段树的解法。
线段树本质上和树状数组差不多,都是通过维护一个区间的量的总和(或其他信息)来达到快速计算的目的。
例题 \(2\):
给定一长为 \(n\) 的序列 \(a\),初始时 \(a_i=0\),现有 \(m\) 次操作,每次操作为以下两种之一:
1 l r val
:将 \(a_i(l\le i\le r)\) 加上 \(val\);
2 l r
: 求 \(\sum\limits_{i=l}^{r}a_i\)。
例题 \(3\):
给定一长为 \(n\) 的序列 \(a\),初始时 \(a_i\) 为给定的数,现有 \(m\) 次操作,每次操作为以下三种之一:
1 l r val
:将 \(a_i(l\le i\le r)\) 加上 \(val\);
2 l r val
:将 \(a_i(l\le i\le r)\) 乘上 \(val\);
3 l r val
: 求 \(\sum\limits_{i=l}^{r}a_i\)。