Problem
树上的路径
Description
给定一个个结点的树,结点用正整数编号,每条边有一个正整数权值。
用表示从结点到结点路边上经过边的权值,其中要求。
将这个距离从大到小排序,输出前个距离值。
Input
第一行两个正整数。
下面行,每行三个正整数,表示结点到结点有一条权值为的边。
Output
Sample Input
1 | 5 10 |
Sample Output
1 | 7 |
Hint
标签:点分治序
ST表
堆
Solution
的加强版,将问题移到了树上。
对于关系到树上所有路径的问题,一般用点分治解决。此题需要用到点分治序。
点分时,记录下每个分治中心,并在从分治中心向外的过程中记录下走到结点的顺序,这样的排列叫做点分治序。其实就是点分树上的序中插入每个点子树的序。
对于一个分治中心,其在点分治序上的第个位置出现,并且从开始做,每个子树的序分别在位置区间,,……对于第个子树中的一点,以为起点,其路径另一端点只能落在点分治序位置区间内,发现以每个点为一端,形成的路径的另一端在点分治序上一定对应一个区间。
这样问题又转化到了数列上,即已知对于每个数,其二元组中另一个数的范围,二元组的权值为,求前大的二元组权值。
这个问题可以用类似BZOJ2006的方法解决,在此不再赘述。
Code
1 |
|