Loading docs/ds/sparse-table.md +12 −13 Original line number Diff line number Diff line Loading @@ -2,17 +2,17 @@ ST 表是用于解决 `可重复贡献问题` 的数据结构,例如区间 RMQ。 RMQ 是英文 Range Maximum/Minimum Query 的缩写,表示区间最大(最小)值。解决 RMQ 问题有很多种方法,可以参考 [RMQ 专题](../topic/rmq.md) RMQ 是英文 Range Maximum/Minimum Query 的缩写,表示区间最大(最小)值。解决 RMQ 问题有很多种方法,可以参考 [RMQ 专题](../topic/rmq.md)。 ## 引入 [ST 表模板题](https://www.luogu.org/problemnew/show/P3865) 题目大意:给定 $n$ 个数,有 $m$ 个询问,对于每个询问,你需要回答区间 $[x,y]$ 中的最大值 题目大意:给定 $n$ 个数,有 $m$ 个询问,对于每个询问,你需要回答区间 $[x,y]$ 中的最大值。 考虑暴力做法。每次都对区间 $[x,y]$ 扫描一遍,求出最大值 考虑暴力做法。每次都对区间 $[x,y]$ 扫描一遍,求出最大值。 显然,这个算法会超时 显然,这个算法会超时。 ## ST 表 Loading @@ -30,7 +30,7 @@ ST 表基于 [倍增](../basic/binary-acc.md) 思想,可以做到 $\Theta(n\lo 显然, $f(i,0)=a_i$ 。 根据定义式,第二维就相当于倍增的时候“跳了 $2^j-1$ 步”,依据倍增的思路,写出状态转移方程: $f(i,j)=\max(f(i,j-1),f(i+2^{j-1},j-1))$ 根据定义式,第二维就相当于倍增的时候“跳了 $2^j-1$ 步”,依据倍增的思路,写出状态转移方程: $f(i,j)=\max(f(i,j-1),f(i+2^{j-1},j-1))$ 。  Loading Loading @@ -90,9 +90,9 @@ int main() { ## 注意点 1. 输入输出数据一般很多,建议开启输入输出优化 1. 输入输出数据一般很多,建议开启输入输出优化。 2. 每次用 [std::log](https://en.cppreference.com/w/cpp/numeric/math/log) 重新计算 log 函数值并不值得,建议如下预处理 2. 每次用 [std::log](https://en.cppreference.com/w/cpp/numeric/math/log) 重新计算 log 函数值并不值得,建议如下预处理: $$ \left\{\begin{aligned} Loading Loading @@ -134,7 +134,6 @@ ST 表能较好的维护“可重复贡献”的区间信息(同时也应满 这并不是一个严谨的数学论证,更为严谨的附在下方: ??? note "更严谨的证明" 理解本段,可能需要具备 [时间复杂度](../misc/complexity.md) 的关于“势能分析法”的知识。 先分析预处理部分的时间复杂度: Loading Loading
docs/ds/sparse-table.md +12 −13 Original line number Diff line number Diff line Loading @@ -2,17 +2,17 @@ ST 表是用于解决 `可重复贡献问题` 的数据结构,例如区间 RMQ。 RMQ 是英文 Range Maximum/Minimum Query 的缩写,表示区间最大(最小)值。解决 RMQ 问题有很多种方法,可以参考 [RMQ 专题](../topic/rmq.md) RMQ 是英文 Range Maximum/Minimum Query 的缩写,表示区间最大(最小)值。解决 RMQ 问题有很多种方法,可以参考 [RMQ 专题](../topic/rmq.md)。 ## 引入 [ST 表模板题](https://www.luogu.org/problemnew/show/P3865) 题目大意:给定 $n$ 个数,有 $m$ 个询问,对于每个询问,你需要回答区间 $[x,y]$ 中的最大值 题目大意:给定 $n$ 个数,有 $m$ 个询问,对于每个询问,你需要回答区间 $[x,y]$ 中的最大值。 考虑暴力做法。每次都对区间 $[x,y]$ 扫描一遍,求出最大值 考虑暴力做法。每次都对区间 $[x,y]$ 扫描一遍,求出最大值。 显然,这个算法会超时 显然,这个算法会超时。 ## ST 表 Loading @@ -30,7 +30,7 @@ ST 表基于 [倍增](../basic/binary-acc.md) 思想,可以做到 $\Theta(n\lo 显然, $f(i,0)=a_i$ 。 根据定义式,第二维就相当于倍增的时候“跳了 $2^j-1$ 步”,依据倍增的思路,写出状态转移方程: $f(i,j)=\max(f(i,j-1),f(i+2^{j-1},j-1))$ 根据定义式,第二维就相当于倍增的时候“跳了 $2^j-1$ 步”,依据倍增的思路,写出状态转移方程: $f(i,j)=\max(f(i,j-1),f(i+2^{j-1},j-1))$ 。  Loading Loading @@ -90,9 +90,9 @@ int main() { ## 注意点 1. 输入输出数据一般很多,建议开启输入输出优化 1. 输入输出数据一般很多,建议开启输入输出优化。 2. 每次用 [std::log](https://en.cppreference.com/w/cpp/numeric/math/log) 重新计算 log 函数值并不值得,建议如下预处理 2. 每次用 [std::log](https://en.cppreference.com/w/cpp/numeric/math/log) 重新计算 log 函数值并不值得,建议如下预处理: $$ \left\{\begin{aligned} Loading Loading @@ -134,7 +134,6 @@ ST 表能较好的维护“可重复贡献”的区间信息(同时也应满 这并不是一个严谨的数学论证,更为严谨的附在下方: ??? note "更严谨的证明" 理解本段,可能需要具备 [时间复杂度](../misc/complexity.md) 的关于“势能分析法”的知识。 先分析预处理部分的时间复杂度: Loading