2024.8 #7

1.[TJOI2015] 弦论

你说得对,但是小 S 觉得 SAM 非常的不优美,所以她打算使用 SA 做。

她决定先研究 \(t = 0\) 的情况。

从头到尾扫,每一个后缀没出现过的子串数为是 \(n - sa_i + 1 - hight_i\)。然后就可以直接枚举每一个位置,然后就可以计算出第 \(k\) 个子串的结尾在哪里。

然后她需要考虑 \(t = 1\) 的情况。

此时她有一个暴论。同样的从前往后扫,然后枚举每一个末尾。但是这是 \(\mathrm O(n^2)\) 的,她很生气。

但是她发现了一个性质,那就是当前面的字母固定时,后面一个字母是单调不降的,满足单调性。所以她想到了用二分做。

她对于后缀数组做前缀和,这样就知道了一个字符为开头的子串有多少个了。那么就可以做了,复杂度为 \(\mathrm O(n \log n)\),她很高兴。

2.BZOJ3864 Hero meet devil

小 S 最近刚学 dp 套 dp,于是她找来了这道道来练手。

小 S 先考虑怎么做内层 dp,也就是求 LIS。先定义 \(g_{i,j}\)\(S\)\(i\) 个字符和 \(T\) 的前 \(j\) 个字符的 LIS 的长度。那么就有转移式:

\[g_{i,j} = \begin{cases} g_{i - 1,j - 1} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ s_i = t_j\\ \max{g_{i - 1,j},g_{i,j - 1}} \ \ \ \ \text{other}\end{cases} \]

这是平凡的。

然后小 S 考虑设计外层 dp。由于之和上一行的状态有关,也就是只需要记录 \(g_{\cdot,j}\) 的所有情况,但是很明显直接纪录会有 \(|S|^{|S|}\) 种可能,很明显不能过。

但是小 S 发现,需要维护的数组每一次的变化要么是 \(+1\) 要么是不变。发现了这一个性质之后,小 S 考虑做一次差分,直接用状压记录状态即可,此时需要记录的状态为 \(\mathrm O(2^{|S|})\) 了。那么这个题就可以做了。小 S 很高兴。

3.[SDOI/SXOI2022] 小 N 的独立集

小 S 已经知道 dp 套 dp 的流程了,于是她决定来做这道有点挑战的题目。

同样考虑内层 dp。按照最大权独立集的套路,我们定义 \(g_{u,0/1}\) 表示选/不选 \(u\)。(具体见没有上司的舞会。)

然后考虑外层 dp。小 S 定义 \(dp_{u,g0,g1}\) 为选节点 \(u\) 的最大权值为 \(g0\),不选节点 \(u\) 的最大权值 \(g1\)

此时小 S 考虑怎么转移。这个转移和最大权独立集的转移比较像,为:

\[dp_{u,g_{u,0},g_{u,1}} \times dp_{v,g_{v,0},g_{v,1}} \to dp_{u,\max{g_{v,0},g_{v,1}} + g_{u,0},g_{v,0} + g_{u,1}} \]

但是小 S 发现这个时候的状态数量非常大,为 \(\mathrm O(n^3k^2)\),时间也爆炸,所以小 S 需要改变 dp 的状态定义。但是小 S 发现外层 dp 的定义无法改动,此时她考虑改变内层 dp 的定义。

树上最大权独立集还有另一种的 dp 方法,那就是定义 \(g_{u,0/1}\) 表示是否强制不选 \(u\) 的最大值。此时有一个性质:\(g_{u,1} \in [g_{u,0},g_{u,0} + k]\)。那么我们定义 \(dp_{u,g1,d}\) 表示 \(g_{u,1} = g1,g_{u,0} = g1 + d\) 的情况数。那么转移式变为:

\[dp_{u,d_1,g_{u,1}}\times dp_{v,d_2,g_{v,1}}\to dp_{u,g_{u,1} + g_{v,1} + d_2,\max(0,d_1 - d_2)} \]

此时的复杂度为 \(\mathrm O(n^2k^4)\),可以通过。

4.[ZJOI2019] 麻将

小 S 认为自己已经掌握了 dp 套 dp 了,所以她决定来做 ZJOI 的神仙题目。

同样的,考虑内层 dp。小 S 先考虑普通情况,也就是 \(4\) 个面子加上 \(1\) 个对子,而对于 \(7\) 个对子的情况,特判一下就行了。

小 S 定义 \(dp_{i,j,k}\) 为,现在还有没有对子,并且有 \(j\) 组形为 \({a-1,a}\) 的牌,以及 \(k\) 组形如 \({a}\) 的牌,此时所能产生的面子的最大值。

然后小 S 把 \(j,k,0/1\) 的两个 \(3 \times 3\) 的矩阵看成一个状态,把得到一张新的牌然后转移到另一个状态看成边,那么就可以建出 dp 自动机。虽然状态看似非常多,但实际上只有 \(2092\) 个,可以放心建。

然后再来考虑设计外层 dp。

回归到原本问题,其实就等于求 \(\dfrac{\sum^{4n-13}_{i = 1} f(i) \times i! \times (4n - 13 - i)!}{(4n - 13)!}\)。其中 \(f(i)\) 的定义为摸了 \(i\) 次牌还没胡的种类数。

为了求解 \(f(i)\),小 S 定义 \(g_{i,j,k}\) 为目前考虑完了前 \(i\) 种牌,目前共有 \(j\) 种牌,在自动机上的节点为 \(k\)。那么 \(g\) 的递推式就显而易见了:

\[g_{i,j,k} \times \dbinom {4-s_i}{t-s_i} \to g_{i+1,j+t,nxt_{k,t}} \]

那么 \(f(i) = \sum^{2092}_{j=1} g_{13,i+13,j}\),然后求出答案了。时间复杂度 \(O(n^2 \times 2092)\),可以通过小 S 很开心。

posted @ 2024-08-27 21:53  sqrtqwq  阅读(1)  评论(0编辑  收藏  举报