专栏文章

【科技】如何对ST表进行卡常

休闲·娱乐参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min3rno8
此快照首次捕获于
2025/12/01 20:05
3 个月前
此快照最后确认于
2025/12/01 20:05
3 个月前
查看原文
正常情况下,ST 表是 O(nlogn)O(n \log n) 预处理并且 O(1)O(1) 查询的。这基于其对两个 2k2^k 的区间的合并。
考虑我们先不采用 ST 表求解 RMQ,而是采用一个比较小众的方法:笛卡尔树+LCA。这样的话问题就变成了如何求 LCA。众所周知,一种非常快速的求 LCA 的方法是欧拉序+RMQ,这样由于欧拉序的长度是原序列的两倍,我们成功将 ST 表的复杂度的常数翻倍。
同时,注意到这种卡常方法具有优秀的可扩展性。因为新问题仍然是一个 RMQ 问题,我们可以考虑再使用笛卡尔树解决,这样新的序列长度继续翻倍。
不难导出以下公式:当嵌套 kk 层笛卡尔树的时候,查询的复杂度变为 O(2knlog2kn)O(2^kn\log 2^kn)。其中,log2kn=log2k+logn=k+logn\log 2^kn=\log2^k + \log n=k + \log n,因此复杂度为 (2knlogn+2knk)(2^kn\log n + 2^knk)。当 k>lognk > \log n 时, 不难发现 nn 可以被视作常数,因此我们成功压掉了原来的复杂度瓶颈 nn,可以将复杂度变为 O(k2k)O(k2^k)

评论

0 条评论,欢迎与作者交流。

正在加载评论...