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
7
7
6
5
4
4
3
3
2
1
Hint
N<=50000,M<=Min(300000,n*(n-1) /2 )
题解:点分治,将在分治过程中点到根的距离放在一个数组中,若将当前子树内的点作为路径的一个端点,另一个端点可以落在一个点分治序列的区间内(之前扫过的子树),长度最大n*logn, 用四元组表示
start,ends,l, r,用ST表维护对应的最优解,查询每一个节点作为起点在对应的l,r区间的最优解,并放入堆中。每次取出最大的元素,并把的它对应的次优解放进去。有点难敲,先放着。。。