数据结构技巧1

题面

有一个序列。

你有 \(n\sqrt n\) 次区间查最小值,\(n\) 次单点修改。

实现 \(O(n\sqrt n)\) 的算法。

题解

肯定是通过平衡修改时个复杂度最终实现查询 \(O(1)\)

考虑序列分块,发现可以通过维护前缀、后缀最小值实现块内的查询。

但是块之间的我们无法处理,因为这是一个区间信息,要 \(O(1)\) 查区间最小值好像只能 st 表。

但是st表不能支持带修啊,不然都不用序列分块了。

不能待修的实质是修改复杂度大了,每次需要 \(O(1+2+4+...+2^{n-1})=O(n)\) 的复杂度。

诶,既然我们现在要查询的是块间的最小值,那么st表的大小不就是 \(\sqrt n\) 的,我们直接修改复杂度还是 \(O(\sqrt n)\) 的!

所以就做完了。

扩展

有一种东西叫做猫树分治,它可以用 \(O(1)\) 的复杂度查询具有结合律的信息,但是修改也是 \(O(n)\) 的,所以如果要维护的信息不是 min/max,可能也是可以做到 \(O(n\sqrt n)\) 的。

posted @ 2022-07-14 21:45  qwq_123  阅读(33)  评论(0编辑  收藏  举报