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