【题解】 CF526G Spiders Evil Plan

场了个 3300,乐坏了。

像我这种低智力人群适合的暴力做法,和目前所有题解不同。

结论是对于点 \(u\) 选择不在以 \(u\) 为根同一个子树内的 \(2k\) 个点然后连起来一定存在一种过 \(u\) 且连通的方案,否则将两条不交的路径交错一定更优,其它题解有很清楚的证明。

接下来问题就是询问每个点选出以它为根的 \(2k\) 个叶子,不在它的同一个子树里这个限制先不管,使得路径的并的和最大。

如果只有一个询问怎么做?

\(u\) 当成根,然后每条边贡献给子树里最深的叶子。 这个做法显然正确,因为每条边第一次覆盖一定是一个子树内的最深的叶子造成的,否则换成它更优,然后按照
\(val_i\) 排序贪心取。

多个询问怎么做?

很多人在这个时候选择了观察性质,而我没那么聪明选择了暴力:

现在以 \(1\) 为根对这棵树进行换根操作。

直接换根,考虑与处理出每个点子树内最远的点和子树外最远的点
,分别为 \(f_x,g_x\),则换根时把根从 \(u\to v\),边权为 \(w\),则这个时候因为每条边最多只会用一次,所以会更改的值有且仅有

\[val_{f_x} \gets val_{f_x}-w \]

\[val_{g_x} \gets val_{g_x}+w \]

于是我们需要一个更改元素并查询前 \(k\) 大的和的数据结构,还得强制在线,使用可持久化权值线段树或者可持久化平衡树就行了。

考虑那个要求在不同子树里怎么处理:

由于我们的贪心方式,最远的点一定是会被选到的,我们只需要找一个和最远的点不在同一子树里的次元的点并且从数据结构里扣掉查询前 \(2k -2\) 大就完了。

时空都是 \(O((n+q)\log n)\)

主席树实现

posted @ 2023-02-06 17:38  寂静的海底  阅读(11)  评论(0编辑  收藏  举报