题目
此题是我做过最难的长链剖分/数据结构题。
没有之一。
紫荆花之恋也太水了吧,xmy每天没事就写一发紫荆花之恋,wk表示这太简单了,每天没事就该写一发Hope
1.出题人所说的 52 p t s 52pts 52pts暴力分。
容易发现对于每一组合法的救援范围,在救援范围内满足条件的点 u u u,构成了树上一个连通块。
但是这一组范围只能被计算一次。
利用树上一个连通块中的点和边满足点数-边数 = 1的性质,
我们可以枚举每个点,答案加上对于这个点合法的范围数,再枚举每条边,答案减去对于这条边两个点都合法的范围数,容易发现这样一组范围就只会被计算一次。
那么我们只需要求出:
f i , j f_{i,j} fi,j子树 i i i内距离 i < = j i<=j i<=j的点组成的包含 i i i的连通块个数。
g i , j g_{i,j} gi,j对于 i i i以及子树 i i i外距离 i < = j i<=j i<=j的点组成的包含 i i i的连通块个数。
那么答案就是 ∑ i f i , L g i , L − [ i i s n o t r o o t ] f i , L − 1 ( g i , L − 1 ) \sum_{i} f_{i,L}g_{i,L} - [i\ is \ not \ root]f_{i,L-1}(g_{i,L}-1) ∑ifi,Lgi,L−[i is not root]fi,L−1(gi,L−1)
注意到 L L L可能会很大,但是可以发现大于子树深度之后的 f f f都等于 f 子 树 深 度 f_{子树深度} f子树深度, g g g也同理可以把范围缩小到 O ( n ) O(n) O(n),从而 O ( n 2 ) D P O(n^2)\rm{DP} O(n2)DP。
2.长链剖分优化
这道题的长链剖分优化对于未熟悉长链剖分套路的同学(即使你做过板题)十分难以理解,难以想象。
2.1
首先是 f f f, f u , i = ∏ v = s o n u ( f v , i − 1 + 1 ) f_{u,i} = \prod_{v = son_{u}} (f_{v,i-1}+1) fu,i=∏v=sonu(fv,i−1+1)
看起来很容易,长链继承,短链暴力。
并不是。
首先长链继承的时候因为后面的 ∏ \prod ∏ 中,需要先 + 1 +1 +1,也就是(对于长链的)区间加。
也就是说需要区间数据结构,我们先分析完剩下的操作。
对于短链 v v v,并不是只有在 < = l e n v <=len_v <=lenv的时候才有贡献,根据我们的 D P DP DP式,以及上文所阐述的 L > l e n v L>len_v L>lenv的时候 f L = f l e n v f_{L} = f_{len_v} fL=fle