[USACO19DEC]Tree Depth P

这篇博客详细解析了USACO竞赛中的题目Tree Depth P,探讨了如何利用动态规划和逆序对概念来解决节点深度问题。博主通过分析得出动态规划转移方程,并讨论了优化方法,包括生成函数和前缀后缀技巧,最终实现了O(n^3)的时间复杂度解法。文章附带源码,但提到空间复杂度较高。
摘要由CSDN通过智能技术生成

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 uv,满足 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 n1的排列,我们在排列后面加一个数,再将前面的排列已某种方式离散,那么我们新加入的数产生的逆序对数的范围为 [ 0 , n − 1 ] [0,n-1] [0,n1],且在前面排列固定的情况下,我们加入的数产生的逆序对数与我们加入的数是一一对应的。
通过上面的方法,容易得到我们的 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=0i1dpi1,jk
但我们还有条件是 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值