CF526G Spiders Evil Plan
题意
给定一棵 n n n 个节点的无根树,每条边有边权。
有 q q q 次询问,每次询问给出 x , y x,y x,y,你需要选择 y y y 条树上的路径,使这些路径形成一个包含 x x x 的连通块,且连通块中包含的边权和最大。
n , q ≤ 1 0 5 n, q \le 10^5 n,q≤105,强制在线。
解析
先看一个引理:
引理1
如果一个树上有 2 k 2k 2k 个叶子节点,就可以用 k k k 条相交的路径覆盖整棵树。
证明很简单,一个叶子节点到另一个叶子节点的路径是唯一的,所以一定可以用 k k k 条路径覆盖整棵树,但如果这些路径不相交,肯定可以通过调整的方式,使得这几条路径相交。
有了引理1,我们不妨有一个想法。每次以 x x x 为根节点,考虑长链剖分,将每个叶子节点到其长链顶端的总权值进行排序,贪心选择前 2 y 2y 2y 个长链的总权值即可(前置题目BZOJ3252的做法)。
但是这种做法显然是不行的,因为每次询问需要强制在线,这意味着整棵树要换根重构,这样时间复杂度就上来了。该算法的瓶颈就在于每次需要换根,考虑如何优化。
按照上述方法,我们第一次一定会选择一个深度最大的叶子节点所在的长链,而这正好符合树的直径的性质,也就是在所有长链中,首选的肯定是树的直径的一段,那么我们就得到的引理2:
每次询问中,必然存在一种方案使得直径的两端中至少有一端被选取。
根据引理2,我们就又可以得到一种新的做法,以这棵树的直径的两端为根节点分别建树,现在的问题就转化成为了在两棵树上分别选择 2 y − 1 2y-1 2y−1 个叶子节点(直径也必然是叶子节点),优化它们到根节点的边的并集的权值和最大。
还是选择长链剖分,贪心选择前 2 y − 1 2y-1 2y−1 个长链的边权和,但这样不一定保证经过 x x x,需稍微调整,先打通 x x x 子树中距离根节点最远的节点到根节点的路径,这样就保证了所选路径一定包含 x x x,然后再去权值总和最小的所选重链,也就是有两种做法:
1.将贡献最小的长链去掉并加入 x x x 所在长链。
2.将离 x x x 最近的长链将下半部分替换成 x x x 所在长链。
此时需要找到 x x x 向上的一个满足条件的节点,再维护一个倍增即可,时间复杂度 O ( n log 2 n ) O(n\log_2n) O(nlog2n)
代码太丑,不放了QWQ