Day 4:数据结构 李羿辰
上午:根号分治与分块
归约
若有解决问题 \(𝐴\) 的代码,则可以在不理解这段代码的前提下用它解决问题 \(𝐵\),那么 \(𝐴\) 就难于 \(𝐵\)。
因为这实际上是将解决 \(𝐵\) 问题转化成了解决 \(𝐴\) 问题,所以也叫将 \(𝐵\) 归约到 \(𝐴\)。
矩阵乘法
证明一些问题强于矩阵乘法,可以得到一些问题的复杂度下界。
以下问题都强于 \(\sqrt{n}×\sqrt{n}\) 的矩阵乘法;
- 树上数颜色;
- 区间出现次数平方和;
- 区间逆序对。
各类矩阵乘法都没有低于 \(3\) 次的简单做法:
- 01 矩阵乘法不比普通矩阵乘法弱;
- \((\min,+)\) 矩阵乘法目前没有低于 \(3\) 次的做法;
(min,+) 卷积
在 dp 问题中常见。
- 若两个数组均凸,则可以直接贪心 \(𝑂(𝑛)\);
- 若有一个数组是凸的,可以做到 \(𝑂(𝑛 log 𝑛)\);
- 一般的情况,无法低于 \(𝑛^2\)。
一般的 \((\min,\max)\) 卷积也需要 \(𝑛^2\)。
杂项难以优化的问题
- 3-Sum 问题:\(𝑛^2\);
- 传递闭包:\(𝑛𝑚\);
- 全源最短路:\(𝑛^3\) 。
复杂度分治
复杂度平衡:分块法
分块法大体而言分成两种:
- 多项式分块,例如根号分块。思路是大块整体考虑,散件逐个考虑。
- \(log\) 分块。思路是将所有块分为 \(𝑂(𝑛)\) 类,从而 \(𝑂(1)\) 计算一块。
\(log\) 分块
-
四毛子有用。
朴素的启发式合并是 \(𝑂(𝑛 log 𝑛)\) 的。
将序列每 \(𝐵\) 个分块。块的种类是 \(𝑂(2^𝐵 )\) 的。
对于每种块,由于我们启发式合并只考虑当前数的个数,所以我们只用求并记录总长度为\(B\)中有1B个数的情况,又由于$B$种情况由$B/2$的情况转移来吗?这里存疑~,所以只需要\(𝑂(\frac{𝑛 log 𝑛}{B})\)的时间复杂度。
通过你在序列上分的块种类,判一下该种类块出现次数,如果出现一次,当前块操作数就为其中数的个数情况的操作数+1,以后若再遇到只为1即可。
最后,再启发式合并剩下的块即可。
好吧,这是我自己胡的,有点懒得实现

浙公网安备 33010602011771号