川剧复演 题解
川剧复演 题解
题意
有 n 场演出、m 出剧目。每场选一出剧目,同一剧目可重复选。
合法条件:任意连续 m 场演出中,都存在某剧目出现至少两次。
换句话说,不允许出现"连续 m 场两两不同"。
暴力 DP
状态
-
把"全局约束"翻译成"局部禁止条件"
合法 ⟺ 不存在长度为 m 的连续子段两两不同。
我们从左往右一场一场地安排演出。假设已经安排好了前 i 场,现在要安排第 i+1 场。什么时候会出问题? 出问题当且仅当第 i+1 场安排完后,末尾出现了 m 个两两不同的元素。
所以危险全部来自于序列末尾那一段"两两不同"的后缀。
-
找到"充分统计量"
我们并不需要知道末尾具体是哪几出剧目,只需要知道一个数字:
末尾最长的、元素两两不同的后缀的长度 j
为什么这个数字就够了?
- 如果 \(j < m-1\):不管下一场选什么,新的"两两不同后缀"最多变成 \(j+1 < m\),不可能出问题。
- 如果 \(j = m-1\):下一场绝对不能选一个全新的剧目,否则 \(j\) 就变成 \(m\) 了,非法。
也就是说,未来的所有决策只依赖于 j,不依赖于具体是哪 j 出剧目。这就是这个状态巧妙的地方——它丢掉了所有无关信息,只保留了对决策有用的那一个量。
-
状态定义
其中 \(0 \le j < m\)(j = m 就非法了,所以状态里不包含 j = m)。
边界:\(f[0][0] = 1\)(空序列,什么都没安排,后缀长度为 0)。
转移
考虑从 \(f[i-1][k]\) 转移过来。当前末尾有 k 个两两不同的元素,现在追加一个新元素 \(x\)。分两种情况:
-
1. \(x\) 重复了后缀中的某一个元素
后缀中 \(k\) 个元素两两不同,所以 \(x\) 恰好等于其中某一个。假设 \(x\) 等于后缀中倒数第 \(s\) 个元素(\(1 \le s \le k\))。
那么新的"两两不同后缀"就是从倒数第 \(s-1\) 个元素到新元素 \(x\),一共 \(s\) 个元素,且这 \(s\) 个元素两两不同。
对于每个 \(s \in [1, k]\),\(x\) 的选择恰好只有 1 种(就是那个等于倒数第 \(s\) 个元素的剧目),所以:
-
2. x 是后缀中没有的全新剧目
此时新的两两不同后缀长度变成 \(k+1\),有 \((m - k)\) 种选择(总剧目数减去后缀中已有的 \(k\) 个)。
但注意:只有当 \(k + 1 < m\) 时才合法,否则就凑齐了 \(m\) 个不同元素。所以:
ans
即把所有可能的后缀长度加起来。
复杂度
- 状态数:\(O(n \cdot m)\)
- 每个状态转移:情况一需要遍历 \(1 \sim k\),共 \(O(m)\);情况二 \(O(1)\)
- 总复杂度:\(O(n \cdot m^2)\)
正解:后缀优化 + 矩阵加速
后缀优化
暴力 DP 的转移中,情况一需要对每个 \(s \in [1, k]\) 累加 \(f[i-1][k]\),这是 \(O(m)\) 的。我们用后缀和把它压成 \(O(1)\)。
-
定义后缀和
设
即从 \(j\) 到 \(m-1\) 的总和。显然 \(s[i][j] - s[i][j+1] = f[i][j]\)。
-
把转移改写为后缀和的形式
情况一:\(f[i][s] \mathrel{+}= f[i-1][k]\)(对所有 \(k \ge s\)),等价于
情况二:\(f[i][k+1] \mathrel{+}= f[i-1][k] \times (m-k)\),即
合并两种情况:
其中约定 \(f[i-1][-1] = 0\)。
这样对每个 \(j\) 只需要 \(O(1)\) 计算,总复杂度降为 \(O(n \cdot m)\)。
矩阵加速
\(n\) 可以达到 \(10^9\),\(O(n)\) 的线性 DP 无法接受。但注意到状态只有 m 个(\(j = 0, 1, \dots, m-1\)),而且转移是线性的,所以可以用矩阵快速幂。
-
构造转移矩阵
把 \(f[i-1][0], f[i-1][1], \dots, f[i-1][m-1]\) 看作一个行向量,转移到 \(f[i][0], f[i][1], \dots, f[i][m-1]\)。
由 \(f[i][j] = s[i-1][j] + (m-j+1) \cdot f[i-1][j-1]\),而 \(s[i-1][j] = \sum_{t=j}^{m-1} f[i-1][t]\),所以:
写成矩阵 \(T\)(大小 \(m \times m\)),其中 \(T[k][j]\) 表示 \(f[i-1][k]\) 对 \(f[i][j]\) 的贡献系数:
- 情况一:当 \(k \ge j\) 时,\(T[k][j] += 1\)
- 情况二:当 \(k = j-1\) 时,\(T[k][j] += (m - j + 1)\),即 \(T[j-1][j] += m - j + 1\)
矩阵的样子如下(以 \(m = 5\) 为例):
第 \(k\) 行第 \(j\) 列:下三角(\(k \ge j\))全是 1(情况一),再加上紧邻的右上角元素(\(k = j-1\))为 \(m-j+1\)(情况二)。
初始向量为 \(f[0] = (1, 0, 0, \dots, 0)\),答案为 \(f[n]\) 的所有分量之和。
-
快速幂
用矩阵快速幂计算 \(T^n\),复杂度 \(O(m^3 \log n)\)。
复杂度
- 后缀优化后单次转移:\(O(m)\)
- 矩阵快速幂:\(O(m^3 \log n)\)
- 总复杂度:\(O(m^3 \log n)\)
对 \(m \le 200\)、\(T \le 5\),\(200^3 \times 30 \times 5 \approx 1.2 \times 10^9\),略紧但实际可通过。
扩展:线性递推 + 多项式快速幂 \(O(m^2 \log n)\)
矩阵 \(T\) 具有特殊结构,可以推出 \(a_n = \sum_{j=0}^{m-1} f[n][j]\) 满足一个 \(m-1\) 阶线性递推:
其中系数:
- \(d_1 = m - 1\)
- \(d_j = (j-1)! \cdot (m - j)\) (\(2 \le j \le m-2\))
- \(d_{m-1} = (m-2)!\)
用多项式快速幂计算 \(x^{n-1} \bmod p(x)\),其中特征多项式:
若 \(x^{n-1} \equiv c_0 + c_1 x + \cdots + c_{m-2} x^{m-2} \pmod{p(x)}\),则
其中 \(a_i = m^i\)(\(i < m\) 时无约束,所有安排都合法)。复杂度 \(O(m^2 \log n)\),对 \(m = 200\) 绰绰有余。
原创·转载请注明出处
✦
浙公网安备 33010602011771号