题意
有nnn个卡包,第iii个卡包里有cic_ici张卡,每张卡有一个能力值。现在从每个卡包里面选一张卡,定义一种方案的价值为选的卡的能力值之和,求价值前kkk大的方案。
n,k,∑ci≤300000n,k,\sum c_i\le300000n,k,∑ci≤300000
分析
很自然的想法是用一个堆来维护所有状态的价值,从价值最大的状态开始,每次往后拓展一些状态,关键在于如何设置状态。
先把所有卡组的卡按能力值从大到小排序。设(val,x,y,z)(val,x,y,z)(val,x,y,z)为一个状态,其中valvalval表示状态的价值,处理了前xxx个卡组,第xxx个卡组选的是第yyy张卡,z表示当前状态是否由2或3操作转移而来,且编号大于xxx的卡组选的均为第一张卡。
然后有如下转移:
1、若y<cxy<c_xy<c