看出了双射但是不会优化了,哦不。双射好像和官方题解根本不一样,但是最后的式子是一样的。

以下令 n=N1n = N - 1,点的编号为 00nn。那么我们对 faifa_i1in1 \le i \le n)的要求就是 0fai<i0 \le fa_i < ifai1faifa_{i - 1} \le fa_i。那么我们可以将 fafa 序列看作一条 (0,0)(0, 0)(n,n)(n, n) 且不越过 y=xy = x 的折线,而 faifa_i 即为 xx 坐标从 i1i - 1 增加到 ii 时的 yy 坐标。

那么一次 ufauu \to fa_u 的操作就相当于从点 uu(下文均将 (x,x)(x, x) 简化为点 xx)向下走直到碰到折线,再向左走直到走回 y=xy = x 上,就走到了点 faufa_u。我们令 LCA(n1,n)=p\mathrm{LCA}(n - 1, n) = p,那么点 n1n - 1 与点 nn 第一次在 y=xy = x 上相遇的位置即为点 pp

下面是一棵 n=8,d=4,fa=(0,0,1,3,3,3,5,6)n = 8, d = 4, fa = (0, 0, 1, 3, 3, 3, 5, 6) 的树对应的折线:

直接刻画还是比较困难,我们转而枚举红线和蓝线的形态,再算出合法的黑线数量。设点 a0,a1,a2,,aka_0, a_1, a_2, \dots, a_kkdk \ge d)为对角线上至少被红线和蓝线其中之一穿过的点,其中 a0>a1>>aka_0 > a_1 > \cdots > a_ka0=n,a1=n1a_0 = n, a_1 = n - 1。那么红线会经过点 a0,a2,a4,,ad,ad+1,ad+2,,aka_0, a_2, a_4, \dots, a_d, a_{d + 1}, a_{d + 2}, \dots, a_k,蓝线会经过 a1,a3,a5,,ad,ad+1,ad+2,,aka_1, a_3, a_5, \dots, a_d, a_{d + 1}, a_{d + 2}, \dots, a_k。对黑线的要求就是,红线和蓝线的每个 J 型拐角下面都要被托住,相当于黑线必须过这些点:

  • (ai2,ai1),(ai2,ai)(a_{i - 2}, a_i - 1), (a_{i - 2}, a_i)2id2 \le i \le d);
  • (ai1,ai1),(ai1,ai)(a_{i - 1}, a_i - 1), (a_{i - 1}, a_i)max(d,1)ik\max(d, 1) \le i \le k);

这些限制显然不弱于不越过对角线的限制,所以我们忽略它。那么设 bi=ai1aib_i = a_{i - 1} - a_i,则黑线的方案数为:

i=3d(bi+bi21bi)i=d+1k(bi+bi11bi)\prod_{i = 3}^d \binom{b_i + b_{i - 2} - 1}{b_i} \prod_{i = d + 1}^k \binom{b_i + b_{i - 1} - 1}{b_i}

由于 b1=1b_1 = 1,式子可以改为:

i=4d(bi+bi21bi)i=d+1k(bi+bi11bi)\prod_{i = 4}^d \binom{b_i + b_{i - 2} - 1}{b_i} \prod_{i = d + 1}^k \binom{b_i + b_{i - 1} - 1}{b_i}

设所有长度为 mm,总和为 nn 的正整数序列 aa'i=2m(ai+ai11ai)\prod_{i = 2}^m \binom{a'_i + a'_{i - 1} - 1}{a'_i} 之和为 F(m,n)F(m, n),那么答案式子可以写成这样:

x=0n1F((d1)/2,x)k=dF(k(d1)/2,n1x)\sum_{x = 0}^{n - 1} F((d - 1) / 2, x) \sum_{k = d} F(k - (d - 1) / 2, n - 1 - x)

考虑计算。考虑 i=2m(ai+ai11ai)\prod_{i = 2}^m \binom{a'_i + a'_{i - 1} - 1}{a'_i} 的组合意义实际上是长度为 nn,值域为 mmii 恰好出现 aia'_i 次,且 cici1+1c_i \le c_{i - 1} + 1 的正整数序列 cc 的个数。证明是简单的,考虑从小到大插入元素,每个 i1i - 1 之后都会紧跟着连续的若干个 ii。我们设 G(m,n)=i=1m1F(i,n)G(m, n) = \sum_{i = 1}^{m - 1} F(i, n),那么 G(m,n)G(m, n) 即为所有长度为 nn,值域为 m1m - 1cici1+1c_i \le c_{i - 1} + 1 的正整数序列 cc 的个数,则 F(m,n)=G(m+1,n)G(m,n)F(m, n) = G(m + 1, n) - G(m, n)

考虑计算 GG。考虑 cc 序列的生成过程:维护一个初始为 00 的变量 xx,每次可以选择以下两种操作之一:

  • xx+1x \gets x + 1 并向 cc 序列末尾加入 xx
  • xx1x \gets x - 1

最后 xx 的值需要变回 00。显然,在满足任何时候都有 0x<m0 \le x < m 的基础上操作 2n2n 次和一个合法 cc 序列构成双射。那么 G(n,m)G(n, m) 即为 (0,0)(0, 0) 走到 (n,n)(n, n) 且不经过 y=x+1y = x + 1y=xmy = x - m 两条直线的方案数,翻折容斥即可。

使用 GG 重写答案式子:

x=0n1(G((d+1)/2,x)G((d1)/2,x))(G(n,n1x)G(d/2,n1x))\sum_{x = 0}^{n - 1} (G((d + 1) / 2, x) - G((d - 1) / 2, x))(G(n, n - 1 - x) - G(d / 2, n - 1 - x))

至此可以 O(n2lnn)O(n^2 \ln n) 计算,但是没有什么用。考虑优化。

发现我们需要算的东西是形如 i=0nG(k1,i)G(k2,ni)\sum_{i = 0}^n G(k1, i) G(k2, n - i) 的。这又可以转化为计算 O(n2k1k2)\mathcal{O}(\frac{n^2}{k1k2})i=0n(2ii+p)(2n2ini+q)\sum_{i = 0}^n \binom{2i}{i + p} \binom{2n - 2i}{n - i + q} 状物,而它的组合意义是 (0,0)(0, 0) 走到 (npq,n+p+q)(n - p - q, n + p + q) 的所有路径与直线 y=x+py = x + p 的相交次数之和。根据这篇文章,这是 i=m2n+1(2n+1i)\sum_{i = m}^{2n + 1} \binom{2n + 1}i,一个组合数后缀和。O(n)\mathcal{O}(n) 预处理出组合数后缀和 gig_i 后答案即为 figi\sum f_ig_i

分情况讨论。对于 k2=nk2 = n 的两种情况,O(n2k1k2)=O(nd)\mathcal{O}(\frac{n^2}{k1k2}) = \mathcal{O}(\frac nd),可以暴力算。对于 k1=k2k1 = k2 的情况,由于上式中的 p,qp, q 分别可以表示为 b+k1x,b+k2xb + k1 x, b + k2 x 的形式,而其中 bb 只有 O(1)\mathcal{O}(1) 种取值,所以 fif_i 只有 O(nd)\mathcal{O}(\frac nd) 个位置有值。k2=k1+1k2 = k1 + 1 的情况,它没有前一种情况的性质,然后想了很久不会算。看了官方题解,可以将折线看作括号序列后有答案等于 (+G(i,k1)+)+G(n1i,k2)\text{(} + G(i, k1) + \text{)} + G(n - 1 - i, k2),也就是 G(n,k2)G(n, k2),可以 O(nd)\mathcal{O}(\frac nd) 算。

于是最终时间复杂度为调和级数 O(nlnn)\mathcal{O}(n \ln n)代码