进行一个脑的补

我要喝六个核桃。我要喝六个核桃。我要喝六个核桃。我要喝六个核桃。我要喝六个核桃。我要喝六个核桃。我要喝六个核桃。我要喝六个核桃。我要喝六个核桃。我要喝六个核桃。我要喝六个核桃。我要喝六个核桃。

很多时候有意义的状态是不多的或是呈现某种特殊分布的,特此记录一些很需要脑子的东西。

当你发现一个 $n^2$ 的可行性 dp,而且没办法优化时,常见的办法是维护点集,点集有很多常见的姿态需要发现,当然,这种 维护点集 的技巧 ,不仅限于用在维护 dp 数组上。

  • 区间(介值定理记录 minmax)

  • $O(1),O(\log),O(\sqrt n)$个区间,这个时候一般可以暴力维护一些没那么好做的操作

  • 每次如果可行点数是向两边 $O(1)$ 的就要考虑是不是区间。

eg. 每步做一次区间赋值 0 或 1,做完后所有 1 向两边扩展 1,这个段数就是 $\sqrt n$ 的。

eg. CF1852D,因为扩展到另一侧再扩展回来会把 +2 造成的空给填充,所以最多只有 2 个区间。

  • $O(n)$ 个区间,这个时候一般要使用平衡树等数据结构维护

eg. CF1415F 分别维护二人拿这个蛋糕时另一个人的可行区间,每次新增的区间都包含 $a_i$,所以会合并成一个区间,可以证明区间总量 $O(n)$。

  • 一个数的所有倍数

这个时候有可能会涉及一些数论知识或者调和级数的复杂度。

  • 值域本身就是 $O(\sqrt n)$ 或者 $O(\log n)$ 的。

比较常见,但是有时候很难发现。

出现的原因常常是转移中出现了二次项,且值域上限为 $n$,或是转移出现了使某个值至少翻倍或成某比例变大。

eg CF354D CF1830D ABC203F

  • $O(\log n)$ 个等差数列

痛 苦 面 具

往往涉及 border 理论和 palindrome series 会涉及。

有时候要根号分治维护。

  • 整线段 + 若干散点

很怪。 往往在涉及到 max/min 或者相关分情况讨论的时候可能会出现。

eg CF1500F 维护可行的 dp 值,每层会新增一个区间,若干散点,我也不知到怎么 可以发现, 出现新增区间的时候一定会合并一堆区间。

posted @ 2023-07-25 13:28  寂静的海底  阅读(31)  评论(0)    收藏  举报  来源