笛卡尔树上深度相关计数

笛卡尔树是个神仙东西。
Daniel\text{Daniel} 神仙出了两道相关的题目,两道题目都巧妙地运用了笛卡尔树的优异性质。
这里总结一下关键的内容。


假设有排列 pip_i ,表示 ii 的权值为 pip_i

笛卡尔树,权值上满足堆的性质,而节点编号满足二叉搜索树的性质。

对于一棵小根笛卡尔树,我们考虑树上的节点 xx 。对于 xx 到根的路径,我们把每条向右的边都与向左的边交换,可以得到一条从根到 xx 的左链。换言之,我们先求出每一条从根到 xx 的左链的方案数,那么我们一定可以通过交换路径上的左右边来涵盖所有的笛卡尔树——也就是涵盖所有的排列情况。

接下来,我们考虑对所有的排列形成的笛卡尔树计数。

链是没有形态一说的,我们只要考虑链的深度就行了。设根的深度为 00fi,jf_{i,j} 表示考虑前 ii 个点,第 ii 个点深度为 jj 的左链方案数。考虑转移,枚举 ii 的父节点 uu,因为是小根笛卡尔树,所以 uu 一定小于 ii ,则:

fi,j=k=1i1fk,j1(i2ik1)×(ik1)!f_{i,j}=\sum_{k=1}^{i-1}f_{k,j-1}\binom{i-2}{i-k-1}\times (i-k-1)!

初值设为 f1,0=1f_{1,0}=1

大概就是除去 i,ki,k ,剩下的 i2i-2 个数中选出来 k1k-1 个是小于 kk 的,这部分的方案数在 fk,j1f_{k,j-1} 中,其余的数在序列中必须摆在 kk 的右边,任意排列即可。

考虑从左链扩展到全树。设 gi,jg_{i,j} 表示第 ii 个点,深度为 jj 的笛卡尔树的方案数。则:

gi,j=fi,j×2j×(nni)(ni)!g_{i,j}=f_{i,j}\times 2^j\times \binom{n}{n-i}(n-i)!

大概就是每一层都可以选择换/不换,比 ii 大的数我们可以插入已经确定的位置内任意排列。

于是我们确定了任意排列的情况下,笛卡尔树上每一个数每一个深度的方案数。对于贡献可以分开计算的题目而言,暴力就可以直接做了。

复杂度 O(n2)\mathcal{O}(n^2)