「总结」$pdf$课: $tree$

一堆树。。

1.Codechef CUTTREE
有序点对((x,y))如果联通,就对答案造成1的贡献。
只需要求出第(i)天期望联通的点对的个数。
((x,y))对第(i)天的贡献就是:(frac{(n-1-dis(x,y))^{underline{i}}}{(n-1)^{underline{i}}})
那么有:

[ans_i=sumlimits_{d=0}^{n-1}frac{(n-1-d)!(n-1-i)!}{(n-1-d-i)!(n-1)!}c_d ]

我们发现除了(c_d)不会求之外,剩下的可以直接卷积。
然而(c_d)是一个经典的淀粉质法法塔模型。

2.Codeforecs 936 E
可以把(x)相同且(y)相邻的点缩成一个点。
然后我们复原节点的相邻关系,就可以形成一个树结构。
我们发现两点之间的路径一定是经过某个重心到离重心最近的位置上。
动态淀粉质搞一下就行了。

3.可持久化动态点分治
层数很少,考虑可持久化。
然而儿子数很多,复制复杂度太高。
加辅助节点把点的度数限制在3以内。

4.Codeforces 757 G
如果不交换的话可以直接可持久化动态点分治,求出([l,r])这部分的贡献就可以。
交换影响两个子树中的贡献,直接修改。

5.树上莫队
我们如果想((x,y) ightarrow(x',y')),只需要把((x,x'),(y,y'))的点的状态取反。如果把树上的点分块,使得块内的路径长度不超过(S)的话,我们可以按照(bl(x),dfn(y))排序询问来做。
分块利用如下方法。
(dfs)的时候维护栈,如果(x)的一个子树中(dfs)多出的点的个数多于(B),那么我们就分成一块,回溯的时候入栈,最后完成(dfs)的时候把栈中剩下的点全部都加入新的一个块内。

6.HNOI2014 世界树
建虚树。
然后(dp)出每个点最近的关键点和距离。边上也有点,那么可以用二分出边界然后计算出管辖的点数。

7.Codeforces Bear and Chemistry
缩便双,然后建边双树。
对于每个询问建立虚树然后加边,最后跑(tarjan)求双连通。
同届每个双连通的点个数即可。

8.POI Tourism
由于路径长度都小于等于10,所以(dfs)链深度不超过5。
(dfs)树不存在横叉边,都是返祖边,所以一个点可以认为只和其所有祖先有关。
状压其祖先状态即可,记录三个状态分别表示未来满足条件,自己被选了,相邻的被选了。
深度很小复杂度正确。

9.例题1
拿出一个糖之后,子树不能被拿糖
(dfs)序列区间,相当于(n)个区间,存在权值,区间不相交,求最大值。
(sort)之后直接(dp)就行了。

10.SDOI 2017 苹果树
拆苹果,拆两个点,一个点上一个苹果,另一个有(w_i-1)个苹果。
后一个接在前一个上。
如果(t-dleq k),相当于是说一条链上其他的节点最多可以选(k)个苹果。
(dp[x][i])(dfs)(x)的时候,选了(i)个点最多能够获得的收益。
如果一个点被选择了,其父亲必然被选择。
那么我们先把(dp[x])复制给(dp[t]),然后再递归,回溯时候,将(f[x])(f[t])(max)

10.NOI2013 快餐店
树的话答案是直径/2.
基环树的话,肯定一条边没用。
考虑枚举这条边然后求直径。
给每一个环点求子树最远距离。
然后求(s_i-s_j+d_i+d_j)的最大值。
那么我们可以直接维护两种值得大小了。

原文地址:https://www.cnblogs.com/Lrefrain/p/12639139.html