我讨厌 DP 和 COUNT 的100个理由(下)

51 【MX-S12-T4】Sea, you again

还是来做点抑郁症数位 DP 吧。

先考虑一个 \(f_B(x)\) 怎么算。显然,从低位往高位合并,如果当前段的和 \(\geq B\) 了,那么就新开一段。

据此,我们设计一个从低位往高位填的数位 DP。设已经填到从低往高第 \(i\) 位,当前这一段的和是 \(S\),后面有 \(j\) 段时的方案数,转移直接记忆化搜索转移,可以做到 \(O(B^2 {n_R}^2)\),拼一拼可以拿 \(50\text{pts}\) 左右。

发现后面有多少段是可以不要的,转移时新开段就乘 \(10\) 就行了。可以做到 \(O(B^2 n_R)\)。不过好像能拿的分差不多。

嗯嗯?不对啊。乘 \(10\) 的方向和填数的方向是不是反的?如果直接做的话前缀和优化就可以做到 \(O(B n_R)\),但是有这个问题的话怎么办?这说明我没有理解数位 DP 的本质。还是看题解吧。

不行的原因有两个,一是因为进制不是 \(10\)\(B\)(我谔谔),二是因为方向确实是反的。不过发现我们可以记录所有方案的 \(B^k\) 的和!这是一个新技巧,虽然也很典了。

写出来发现是个前缀和优化,直接做一做就行了。题解说比较 dirty work。所以还是先做杂题吧。

52 Nested Segments

先考虑没有 \(m\) 的限制时答案是什么。因为区间两两不交或包含,所以它会形成一个天然的分治结构。设 \(f(n)\) 表示无限制时所有区间属于 \([1,n]\) 时的选择方案数,枚举断点可以得到一个酷炫的自卷积形式即 \(f(n)=\sum\limits_{i=1}^{n-1}f(i)f(n-i)\)。然后 \(f(1)=1,f(2)=1,f(3)=2,f(4)=5,f(5)=14,\dots\)。很显然,这就是卡特兰数的自卷积形式,而 \(f\) 基本上就是卡特兰数。

\(m\) 也很简单。加上区间 \([1,n]\) 后对它给出的区间建棵树,然后答案就是若干个 \(f(x)\) 的乘积。原因显然。做完了。

53 [ARC160D] Mahjong

好题啊。Combinatorics。

54 Billetes MX (Hard Version)

坏题啊。先拆位。

关键观察:

  1. 两行要么相同要么完全不同。
  2. 可以先确定第一行,剩下行中空行有两种方案,非空行有至多一种方案。
  3. 为了让非空行合法,我们有形如第一行中第 \(i\) 个和第 \(j\) 个必须不同/相同的限制,这可以使用扩展域并查集。然后添加操作也就简单了。

55 Beautiful Patterns (Hard Version)(已过)

好题啊。平方拆贡献。枚举 \([l_1,r_1],[l_2,r_2]\),看它们都是回文串的概率。

显然,\([l,r]\) 是回文串的概率是 \(\frac{m^{\lceil\frac{Len}{2}\rceil}}{m^{Len}}\)。这个可以通过连边的方式来理解。同理,我们可以枚举两个子串的交的长度,然后就能震惊的发现,它们同为回文串的概率居然是独立的(与交的长度无关)!即,这个概率是 \(\frac{m^{\lceil\frac{Len_1}{2}\rceil}}{m^{Len_1}}\times\frac{m^{\lceil\frac{Len_2}{2}\rceil}}{m^{Len_2}}\)

然后有特殊情况需要考虑,就是两个串如果回文中心相同,它们连出来的图就有环了(其它情况可以证明一定无环,然后才能推出概率独立)。不过容易知道,这种概率只和两个串中更长的有关,所以简单处理一下就行了。

然后推一下式子吧。这个参数和长度比较有关,所以枚举长度。先假设没有特殊情况。

\(\sum\limits_{i=1}^n\sum\limits_{j=1}^n \frac{m^{\lceil\frac{i}{2}\rceil}}{m^{i}}\times\frac{m^{\lceil\frac{j}{2}\rceil}}{m^{j}}(n-i+1)(n-j+1)\)

这个直接前缀和优化。然后考虑特殊情况。

\(\sum\limits_{i=1}^n\sum\limits_{j=1}^n [i\equiv j\pmod 2](n-\max(i,j)+1)(\frac{m^{\lceil\frac{\max(i,j)}{2}\rceil}}{m^{\max(i,j)}}-\frac{m^{\lceil\frac{i}{2}\rceil}}{m^{i}}\times\frac{m^{\lceil\frac{j}{2}\rceil}}{m^{j}})\)

这个也可以前缀和优化。于是大概 \(O(n\log p)\) 做完了。

UPD:随便 \(O(n)\)

56 Binary Strings and Blocks(已过)

越来越傻了。足以证明我有多不会 Combinatorics。

显然,一个区间不合法,当且仅当区间里的元素全部相同。于是我们直接线性 DP。设 \(f_i\) 表示前 \(i\) 个数填的方案数。然后怎么转移呢?我们可以枚举最后一段是什么,假设是 \([j,i]\),那么我们其实可以直接加上 \(f_{j-1}\),因为这相当于对于 \(f_{j-1}\) 中的每一种方案,在末尾去接一个和原来末尾不一样的串。所以就不用乘二。然后还得满足条件,只要每一步转移都不和条件冲突,那么答案就是对的。

直接找到 \(lst_i\),代表满足 \(r_j\leq i\)\(\max l_j\)。所以合法的 \(j\) 就满足 \(j\in[lst_i+1,i]\)。直接前缀和优化就做完了。

值得一提的是,\(f_0\) 应初始化为 \(2\)。因为从它转移代表无中生有一个初始串,这个初始串显然有两种方案。时间复杂度 \(O(n)\)

越来越傻了。足以证明我有多不会 Combinatorics。

57 QOJ 9449 - New School Term

不难。只是我太神秘了。

posted @ 2025-11-19 19:53  Just_int_mian  阅读(56)  评论(2)    收藏  举报