P4566 [CTSC2018] 青蕈领主

· · 题解

终于会全在线卷积了。

把所有区间 [i-L_i+1,i] 画出来,手玩发现如果存在两个区间相交但不包含那就无解,而且如果 L_n \ne n 也无解。

否则可以把区间画成一个树形结构,对于树上每个点考虑它的填数方案,发现可以把它的每个儿子缩成一个点考虑,那么我们只需要解决这样一个子问题:形如 L=\{1,1,1,\cdots,n+1\} 的方案数计数,设这个方案数为 f(n)。我们需要对所有 n \le 5 \times 10^4 求出 f(n)

人类智慧地,在逆排列上考虑,相当于求长度为 (n+1) 的排列,使得所有不包含最大值的区间都不连续。考虑加入最小值 1 并把加入前的所有数加一,讨论加入最小值前序列的情况:

于是我们得到递推式:

f(n)=(n-1)f(n-1)+\sum_{i=2}^{n-2}(i-1)f(i)f(n-i)

(为了让这个式子比较好看,我们翻转了右边求和的下标)

这是全在线卷积的形式,即形如 c=a*b 的问题,其中 a,b 都需要在线得出。

考虑这种问题的处理方法:不妨设要求 0 \sim nf,令 m=\left\lfloor\frac{n}{2}\right\rfloor。假设我们已经求出了 0 \sim mf,考虑对后面的贡献,设它从 a_ib_j 得到。

我们知道半在线卷积可以简单地在 O(n \log^2 n) 复杂度内求解,则 T(n)=T\left(\frac{n}{2}\right)+O(n \log^2n),由主定理立得总复杂度为 O(n\log^2 n)

上述算法的暴力卷积实现,80pts。可读性应该挺强的。

NTT 实现,100pts。