[bzoj3522][bzoj4543][POI2014]HOTEL

题解:

比较难的一道题目

首先考虑暴力dp

我们会发现构成这种形状只有三种情况

1.三个点的lca相同

2.两个点lca相同,第三个点是lca的祖先

3.两个点lca相同,第三个点是lca祖先的子树中某点

对于1,2两种情况是比较好解决的

对于第3种情况,我们可以考虑放到lca处或者转折处计算

1.放在lca处计算

f[i][j]表示考虑i这个点,子树中距离i为j的点的个数

g[i][j]表示i的祖先的子树中到i距离为j的个数

不过这样dp的时候,我们需要删除掉当前点的影响

2.放在转折点计算

f[i][j]表示考虑i这个点,子树中距离i为j的点的个数

g[i][j]表示考虑i这个点,其中子树中取两个点,要求满足他们深度相同,并且他们的lca-i的距离+j=他们到lca的距离

那么考虑一下统计答案

1.

2.g[i][0]

3.令y表示x的父亲 f[y][i]*g[x][i+1]+g[y][i+1]*f[x][i]

这样是n^2的 考虑长链剖分优化

上一篇:centos7部署asp.net core 应用程序


下一篇:objective-c 条件运算符