10-05 树杂题 笔记
感觉罗大神两天讲题的听课体验都挺好的啊
今天最后两题有点神仙,暂时还没放上来,完全消化了再填坑吧
「CF911F」
Description
给定一棵 个节点的树,你可以进行 次操作,每次操作步骤如下:
- 选择 两个度数为 的节点。
- 将 之间的距离加到 上。
- 将 从树上删除。
求一个操作序列使得 最大。
Solution
先把直径拿出来,将直径外的点一个一个的和直径中的某一个端点配对并删掉。最后再将直径删掉。
这个做法显然是对的。。。
「CF1051F」
Description
给定一张 个点 条边的带权无向联通图, 次询问,每次询问 到 的最短路长度。
Solution
首先随便搞一棵生成树,把这些非树边边的端点标记为特殊点。
对于每一个询问,如果最短路只经过生成树上的边,就可以直接计算。
否则一定经过了一个特殊点,把所有特殊点预处理出最短路,然后枚举这个特殊点,然后更新答案就行了
「CF1042F」
Description
给定一棵 个节点的树,定义叶子是度数为 的节点,点集 是好的如果满足任意两个 中的点之间的距离
现在要求将所有叶子分成若干不相交的好的集合,请问最少分成多少个好的集合。
Solution
先随便选一个不是叶子的根,然后可以自底向上贪心。
设 表示 为根的子树内已完成的好的集合的数量, 表示未完成的集合中离 最远的叶子的距离。
(实际上这里指的未完成的集合是指集合内距离都,如果大于则必须再新加入一个集合)
考虑如何计算
首先将所有儿子的 先求和,然后将所有儿子的 排序,不断检查 一下最大的 和次大的 相加是否大于 ,如果大于,那么就将最大的 删掉, 并把 加上 1,循环过程。否则就令 等于最大的 加 并跳出。
「CF1025D」
Description
给定 个节点,每个节点上有一个数字,要求用这些节点构建一棵二叉搜索树,满足有边相邻的两个节点上的数字互质。
Solution
先排序,考虑Dp
设 表示第 个点到第 个点,以 为根是否可行。
转移的时候查看是否存在 满足 且 上的数字和 上 的数字互质,右边类似。
这样就是 的。 注意到上面的做法有一些重复运算。
于是设表示是否存在 满足 且 上的数字和上的数字互质,类似地定义
于是复杂度就被降为
「CF955F」
Description
给定一棵以 号点为根的树。若满足以下条件,则认为节点 处有一个 叉高度 为 的堆:
- 若 ,则 本身就是一个 叉高度为 的堆。
- 若 ,则 需要有至少 个儿子满足在儿子处有一个 叉高度为 的堆。
令 表示在 处 叉堆的最大高度,求
Solution
如果固定 ,求所有的 只需要dfs 整棵树,对于某个点 ,若其子节点数 ,则 ,否则 = 子节点 的 dp 值中第 大的值 。运用 nth_element 可以做到 。这样总复杂度就是
观察到对于 ,有 ,所以可以考虑对 值分段计算。
设 表示满足 的最大的 。
只有 个状态,计算 的时间复杂度是 ,计算出 f 后就可以轻松得到答案了。
来历不明的题
Description
给定一棵 个点的带边权树, 次询问,每次询问给出两个值 ,求以下值:
Solution
动态点分治(点分树)裸题
首先点分治,把分治结构建好。
每个分治中心要记录当前分治区域所有点到分治中心的距离,以及分别记录每个分 治子区域中的所有点到分治中心的距离,以及当前分治中心到其分治祖先的距离。
每次查询时在每个分治中心根据以上信息查询就可以了。