Description
Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.
There are m chain on the tree, Each chain has a certain weight. Coco would like to pick out some chains any two of which do not share common vertices.
Find out the maximum sum of the weight Coco can pick
题意:给出N个点的树,M条树链,树链有权,问在取出的树链互不相交的情况下,权值和最大是多少。
解法:可以这么考虑,若某点作为一个点对X,Y的LCA,那么如果取了这条链,其子树的解最大是多少呢?
设DP[x]表示以x为根的子树中,取完以此点为lca的链后能取得的最大值。那么可以知道,取了某条链后(此链的lca为x)其能获得的最大值为 Σ DP[{son}] +W 其中{son}是此链的儿子集合(不包括链本身),那么我们可以dfs处理,dfs到某一个点x,处理以x点为lca的所有链,计算出取了每条链后能获得的值的最大值,将其赋值给dp[X]。
那么怎么求Σ DP[{son}] ? 我们可以这么处理:每次求出一个dp[X],将 -dp[X] 加到X点的VAL[],+dp[X]加到X点的父亲的VAL[],那么 Σ VAL[链上的点] 就是所求的答案。很明显,求链上点权和 可以用树链剖分+线段树写,复杂度为N*logN*logN。(实际上,因为此题没有修改,可以DFS序+树状数组快速处理 O(N*logN))
代码:(ZKW线段树 1200+MS)
#include
#include
#include
#include
#include
#include
#include
#include