P8478 「GLR-R3」清明
https://www.luogu.com.cn/problem/P8478。
好题要点赞。
考虑 \(k=1\)。可以发现,令 \(c_i\) 表示 \(i\) 滴向 \(i+1\) 的水量,则有:\(\prod a_i'=\prod(a_i-c_i+c_{i-1})\)。直接硬拆括号,并进行 DP,注意 corner case 即可。
当 \(k>1\) 的时候,考虑拓展这个做法。类似地,定义 \(c_{i,j}\) 表示 \(i\) 滴向 \(j\) 的水量,可以得到 \(prod a_i'=\prod \left(a_i-\sum\limits_{j=i+1}^{i+k}c_{i,j}+\sum\limits_{j={i-k}}^{i-1} c_{j,i}\right)\)。可以发现,如果 \(i\not=j\),\(c_{i,*}\) 与 \(c_{j,*}\) 是相互独立的,因此考虑枚举 \(c_{i,*}\) 对所有括号的贡献,并状压记录已经被选了数的括号。
可以发现,我们需要解决形如下面的两个问题。这两个问题中用到的变量和题目中的变量没有关系。
设 \(a\) 为长度为 \(n+u\) 的序列。给定 \(m\),请求出下面两个式子的值。
\(\sum\limits_{\sum a\le m}\prod\limits_{i\le n}a_i\)。
\(\sum\limits_{\sum a\le m}a_1\prod\limits_{i\le n}a_i\)。
对于整数拆分问题,我们一般可以用 GF 得到比较优美的形式。
通过求导,可以得知:\(\sum ix^i=\dfrac{x}{(1-x)^2}\),\(\sum i^2x^i=\dfrac{x+x^2}{(1-x)^3}\)。
两问方法类似,这里只讲第一问。
由于 \(u\) 相对无用,先将形式化作 \(\sum\limits_{\sum\limits_{i\le n} a_i\le m}\dbinom{m+u-1-\sum\limits_{i\le n}a_i}{u-1}\prod\limits_{i\le n} a_i\)。
这个东西就是在求 \([x^m]\left(\dfrac{x}{(1-x)^2}\right)^n(1-x)^{-u}(1-x)^{-1}\)。第一个东西是 \(\prod a_i\) 的贡献,第二个是组合数的贡献,第三个是求前缀和。
最后化简出式子是 \(\dbinom{m+n+u}{2n+u}\)。由于 \(m\) 很大,\(2n+u\) 很小,需要用类似拉格朗日插值的方法求出组合数。
由此,我们可以求出转移系数,进行 DP。朴素转移是 \(O(n3^k)\) 的,转移是 dp 数组与一个只和 popcount 有关的数组作子集卷积,可以用高维前缀和优化到 \(O(nk^22^k)\)。
接下来考虑 \(k=n-1\)。可以发现,我们此时不再关注具体哪些括号没有选,因为它们本质相同;因此可以只记录没有被选中的括号个数,做到 \(O(n^3)\)。
思考这能否推广到 \(k\) 比较大的时候,尝试用 \(n-k\) 去拟合状态。可以发现,当 \(2k>n\) 时,我们的确只用记录后 \(n-k\) 个括号是否已经被选中。这是因为,前 \(k\) 个括号如果被选中,那么它肯定合法,不会出现距离 \(>k\) 的贡献。
因此,令 \(dp_{i,j,S}\) 表示后 \(i\) 个中,\([i,k]\) 选了 \(j\) 个括号,后 \(n-k\) 个括号被选中的集合为 \(S\) 的方案,优化类似前面,可以做到 \(O(n(n-k)^32^{n-k})\)。
由此,根据 \(k\) 的范围跑对应的 DP 可以通过。
其实还能做到更优。
考虑用容斥优化 \(k\) 比较大的过程。钦定一个集合 \(S\),满足 \(S\) 中的集合必须选了一个不在括号里的数,即对于 \(i\),括号内是 \(f_{t,i}\) 且 \(i-t>k\)。直接跑 \(k=n-1\) 的 DP 可以做到 \(O(n(n-k)^22^{n-k})\)。
听说 \(2k>n\) 还有 poly 时间复杂度做法?不想看了(

浙公网安备 33010602011771号