Description
有$N$个忍者及一个Master,忍者从$1$~$N$编号,Master编号为0,忍者之间有从属关系,上级的编号一定比下属小。
每个忍者有一个工资和领导能力值。
现要求派出一些忍者并确定一名领导者,派出忍者要支付工资。领导者也可以被派出,但派出就付工资,不派出就不用,领导者必须是派出的所有忍者的上级(祖先)。
求:在预算范围内派出的忍者数*领导者的领导能力值的最大值。
Input
第一行:$N$和$M$,$N$表示忍者数,$M$表示工资总预算。
接下来$N$行:每行三个整数,$B_i$、$C_i$、$L_i$,其中$B_i$表示上级,$C_i$表示工资,$L_i$表示领导能力值。
Output
一行,一个数:答案。
Solution
用主席树做。
建起来明显就是一棵树。
按DFS遍历一遍(前序遍历)并记录每个点进去和出来的时间,分别用数组$in$和数组$out$记录。
以工资大小顺序为下标,累加总工资和人数。
再以$in$数组的时间先后为顺序,把点一个一个加进去,更新原本那颗树。
不难发现,每个点的子孙的$in$时间就在他进去和出去的时间的范围内。
所以枚举每个点,用它$out$时间时的线段树减去$in$时间时的线段树,就剩仅由它子孙信息构成的线段树了。
在此基础上查找合法的工资数的最大值,以此找出改点所能派出的最大人数。然后在乘上改点的领导能力,取最大值。
Code
|
|