像潮落潮涌,送我奔向自由。|

寂静的海底

园龄:3年2个月粉丝:59关注:15

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

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

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

  1. n,c104

  2. n,c105

  3. n,c107

考虑只有一行怎么做?

fi,j 表示点 i 颜色为 j 的方案数。

把 dp 拍了,只管第二维。

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

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

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

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

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

分情况:

100..001
a00..00b

100..002
a00..00b

100..00b
a00..002

100..00b
a00..001

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

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

这样可以做到 O(nc),还是把 dp 拍了,考虑 fifi+1 的变化:

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

也就是 除去那 O(1) 个值,剩下的值还是进行的是一个线性变换,令转移到 b=a 的系数是 s0,转移到其它值的系数是 s1,那么就是 fi(s0s1)fi+sum×s0sum 表示所有不为那 O(1)af 值之和。

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

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

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

时间复杂度 O(nlogmod),瓶颈在求逆元。

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

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

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

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

复杂度线性。

posted @   寂静的海底  阅读(8)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起