【题解】P5359 dp优化 复杂度分析

一个可以做到线性的办法。

给你一个 $2\times n$ 的网格图,有些点已经被着色,求这个图的 $c$ 染色方案数。

  1. $n,c\leq 10^4$

  2. $n,c\leq 10^5$

  3. $n,c\leq 10^7$

考虑只有一行怎么做?

$f_{i,j}$ 表示点 $i$ 颜色为 $j$ 的方案数。

把 dp 拍了,只管第二维。

转移每步转移到其他颜色,相当于求全局和 $s$,再将每个元素置为 $(c-1)s - f_i$,再加上一个全局置零。

可以通过 维护一个全局标记 $a_i\gets k a_i +b$,这是可并的,同时维护 $k$ 的逆元,复杂度线性。

很困难的问题就是如果有两行怎么办,很难避免记录两个格子的颜色,如果记录了复杂度完全没办法降低。怎样才能只记录一个格子的颜色呢?

考虑在有一个位置被染色的列断开,进行 dp,这样两个断点之间都是空白的区域,而在断点处有至少一个格子的颜色是确定的,记录另一个即可。

两个断点之间的方案数如何计算?

分情况:

100..001
a00..00b

100..002
a00..00b

100..00b
a00..002

100..00b
a00..001

总共只有四种本质不同的情况,每种情况对于某个 $a$,转移的方案数不同的 $b$ 只有 $O(1)$ 种 : $b = 1$ 或 $b = 2$ 或 $b = a$。

这是可以预处理的(因为有意义的颜色只有 $O(1)$ 种),直接记录两个位置的值暴力 dp 与处理出来即可。

这样可以做到 $O(nc)$,还是把 dp 拍了,考虑 $f_i \to f_{i+1}$ 的变化:

有区别的 $a$ 也只有 $O(1)$ 种,其它像其它转移到系数都是相同的,只有转移到自己的系数是不同的。

也就是 除去那 $O(1)$ 个值,剩下的值还是进行的是一个线性变换,令转移到 $b = a$ 的系数是 $s_0$,转移到其它值的系数是 $s_1$,那么就是 $f_i\gets (s_0-s_1)f_i+sum\times s_0$,$sum$ 表示所有不为那 $O(1)$ 个 $a$ 的 $f$ 值之和。

$x\gets kx+b$ 这是一个线性变换,是可并的,维护形如线段树 2 的 tag 即可。

然后这个过程总共还有 $O(n)$ 次单点修改 和 全局清空。

因为不方便修改全局 tag,所以修改当前值,解出 $kx+b=value$ 的 $x$ 赋值即可,所以我们需要保持 $k$ 非 $0$,否则会没有逆元,当 $k=0$ 时直接当作全局清空后赋值为 $k=1$,$b$ 不变即可。

时间复杂度 $O(n\log mod)$,瓶颈在求逆元。

然后可以用在线 $O(1)$ 科技求逆元。

(那玩意常数太大了,怎么可能。)

考虑缩减求逆元的次数,我们每次乘上去的 $k$ 一定是预处理出来的某种长度的方案数,求出每次的逆元,再维护一个 $k$ 的逆元。

因为不同的长度只会有 $O(\sqrt n)$ 种,所以维护的逆元只有 $O(4 \sqrt n)$ 个。

复杂度线性。

posted @ 2023-06-18 18:49  寂静的海底  阅读(4)  评论(0编辑  收藏  举报  来源