Codeforces Round #728 (Div. 2) D. Tree Array

发现C题只有1k4。。 花了20分钟,有点难受
D题。给一个树,树上每个节点都有一个权(权等于节点号,其实就是从1...节点总数)。按照以下方式按顺序依次选择节点:第一个节点随机,从第二个节点开始,随机的选择某个节点(前提是这个节点与已经选好的节点所构成的点集有一条边直接相连)
。直到选完为止。
按照节点按选择的顺序,放入数组中,统计逆序对。
现在求逆序对个数的期望。

思路:求每个点的贡献,玩样例发现随着步骤的增加越来越复杂。感到十分惶恐。无法继续做下去了。
正确思路:
1.统计两个点的贡献。
2.(a,b)的贡献是a<b且b出现的比a早。
3.另l = lca(a,b),可以注意到,直到选择到他们的公共祖先之前,先把a放进去和先把b放进去的概率是一样的
4.所以到l之前都是等概率的。(关于a和b谁在前的问题)
5.问题被转化为:
现在有两个栈,dist(l,a) 和dist(l,b),和一个p来把其中一个栈的顶部元素弹出去。
现在就是求dist(l,b)能否在dist(l,a)被清空之前被清空。

概率DP!
可以很容易的推出转移形式。
F[x][y]=(F[x−1][y]+F[x][y−1])/2

posted @ 2021-06-30 10:18  procaka  阅读(83)  评论(0编辑  收藏  举报