Tree Depth P
题解
我们先考虑一个点的深度可以以怎样的方式表达出来,很明显,任意一个点的深度就是该点的祖先的个数,
即 d e p u = ∑ v = 1 n [ l c a ( u , v ) = v ] dep_{u}=\sum_{v=1}^{n}[lca(u,v)= v] depu=∑v=1n[lca(u,v)=v]。
我们考虑一个节点在什么时候会成为另一个节点的祖先,我们的二叉搜索树的建树方法与笛卡尔树的建树方法很小,引用结论,其实不知道结论也很容易猜出来, 当 ∀ i ∈ [ u , v ) , a i > a v \forall i\in[u,v),a_{i}> a_{v} ∀i∈[u,v),ai>av, a v a_{v} av可以成为 u u u的祖先。
所以我们要求的是对于数对 ( u , v ) (u,v) (u,v),我们不妨设 u ⩽ v u\leqslant v u⩽v,满足 min i = u v a i > a v \min_{i=u}^{v}a_{i}>a_{v} mini=uvai>av,且逆序对数的序列数为 k k k的序列数。
我们先考虑构造一个长度为 n n n的逆序对数为 k k k的序列的方法数。
如果我们已经有了一个长度为 n − 1 n-1 n−1的排列,我们在排列后面加一个数,再将前面的排列已某种方式离散,那么我们新加入的数产生的逆序对数的范围为 [ 0 , n − 1 ] [0,n-1] [0,n−1],且在前面排列固定的情况下,我们加入的数产生的逆序对数与我们加入的数是一一对应的。
通过上面的方法,容易得到我们的 d p dp dp转移式:
d p i , j = ∑ k = 0 i − 1 d p i − 1 , j − k dp_{i,j}=\sum_{k=0}^{i-1}dp_{i-1,j-k} dpi,j=k=0∑i−1dpi−1,j−k
但我们还有条件是 a v a_{v} av是区间 [ u , v ] [u,v] [u,v]中最小的,这也就相当于钦定了 a v a_{v} av在 [ u , v ] [u,v] [u,v]中的逆序对数量。
原来的序列 d p dp dp