BZOJ 3784 树上的路径(点分治+ST+堆+贪心)待处理

Description

给定一个N个结点的树,结点用正整数1..N编号。每条边有一个正整数权值。用d(a,b)表示从结点a到结点b路边上经过边的权值。其中要求a<b.将这n*(n-1)/2个距离从大到小排序,输出前M个距离值。
 

 

Input

第一行两个正整数N,M
下面N-1行,每行三个正整数a,b,c(a,b<=N,C<=10000)。表示结点a到结点b有一条权值为c的边。
 

 

Output

共M行,如题所述.
 

 

Sample Input

5 10 
1 2 1 
1 3 2 
2 4 3 
2 5 4

Sample Output












Hint

N<=50000,M<=Min(300000,n*(n-1) /2 )

 

题解:点分治,将在分治过程中点到根的距离放在一个数组中,若将当前子树内的点作为路径的一个端点,另一个端点可以落在一个点分治序列的区间内(之前扫过的子树),长度最大n*logn, 用四元组表示

start,ends,l, r,用ST表维护对应的最优解,查询每一个节点作为起点在对应的l,r区间的最优解,并放入堆中。每次取出最大的元素,并把的它对应的次优解放进去。有点难敲,先放着。。。

 

posted @ 2019-10-28 15:33  N_Yokel  阅读(130)  评论(0编辑  收藏  举报