CF566C Logistical Questions
题意:给出一棵
求一个点
首先观察性质:给定
对于任意一条路径上的
这就告诉我们,整颗树的代价必然朝着一个中心(也就是我们要找的最小值点)单调下降。
我们可以先选取一个点,求出代价,然后比较相邻点的代价,往唯一的代价小的点走。
考虑点分治,每次向更低的联通块找重心,这样可以保证移动不超过
问题在于中心的度数可能很大,对每个相邻点都计算代价会很慢。
如何判断函数的增减趋势?不难想到求导。
先求出每个子树的导数和,由线性性易求。
具体咋求:
然后查看其他子树的导数和减去某个子树的导数和,如果为负数则表明这里低。
不过,我们在这里强行把离散函数变成了连续函数,最后一跳可能取在某条边的中间,这时需要把两个端点都试一试。
复杂度