Day 4:数据结构 李羿辰

上午:根号分治与分块

归约

若有解决问题 \(𝐴\) 的代码,则可以在不理解这段代码的前提下用它解决问题 \(𝐵\),那么 \(𝐴\) 就难于 \(𝐵\)
因为这实际上是将解决 \(𝐵\) 问题转化成了解决 \(𝐴\) 问题,所以也叫将 \(𝐵\) 归约到 \(𝐴\)

矩阵乘法

证明一些问题强于矩阵乘法,可以得到一些问题的复杂度下界。
以下问题都强于 \(\sqrt{n}×\sqrt{n}\) 的矩阵乘法;

  1. 树上数颜色;
  2. 区间出现次数平方和;
  3. 区间逆序对。

各类矩阵乘法都没有低于 \(3\) 次的简单做法:

  1. 01 矩阵乘法不比普通矩阵乘法弱;
  2. \((\min,+)\) 矩阵乘法目前没有低于 \(3\) 次的做法;

(min,+) 卷积

在 dp 问题中常见。

  1. 若两个数组均凸,则可以直接贪心 \(𝑂(𝑛)\)
  2. 若有一个数组是凸的,可以做到 \(𝑂(𝑛 log 𝑛)\)
  3. 一般的情况,无法低于 \(𝑛^2\)

一般的 \((\min,\max)\) 卷积也需要 \(𝑛^2\)

杂项难以优化的问题

  1. 3-Sum 问题:\(𝑛^2\)
  2. 传递闭包:\(𝑛𝑚\)
  3. 全源最短路:\(𝑛^3\)

复杂度分治

复杂度平衡:分块法

分块法大体而言分成两种:

  1. 多项式分块,例如根号分块。思路是大块整体考虑,散件逐个考虑。
  2. \(log\) 分块。思路是将所有块分为 \(𝑂(𝑛)\) 类,从而 \(𝑂(1)\) 计算一块。

\(log\) 分块

  1. 四毛子有用。

  2. P9969

朴素的启发式合并是 \(𝑂(𝑛 log 𝑛)\) 的。
将序列每 \(𝐵\) 个分块。块的种类是 \(𝑂(2^𝐵 )\) 的。

对于每种块,由于我们启发式合并只考虑当前数的个数,所以我们只用求并记录总长度为\(B\)中有1B个数的情况,又由于$B$种情况由$B/2$的情况转移来吗?这里存疑~,所以只需要\(𝑂(\frac{𝑛 log 𝑛}{B})\)的时间复杂度。

通过你在序列上分的块种类,判一下该种类块出现次数,如果出现一次,当前块操作数就为其中数的个数情况的操作数+1,以后若再遇到只为1即可。

最后,再启发式合并剩下的块即可。

好吧,这是我自己胡的,有点懒得实现

posted @ 2025-06-27 19:46  thousands_of_years  阅读(16)  评论(0)    收藏  举报