【题解】P5359 dp优化 复杂度分析
一个可以做到线性的办法。
给你一个 $2\times n$ 的网格图,有些点已经被着色,求这个图的 $c$ 染色方案数。
-
$n,c\leq 10^4$
-
$n,c\leq 10^5$
-
$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)$ 个。
复杂度线性。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17970906,谢谢你的阅读或转载!