CF1442D Sum 做题记录

给定 nn 个单调不降的数组,初始计数器 sum=0sum=0。你需要进行 kk 次操作,每次选择某个数组的第一个未被删除的元素 xx,将 sumsum 加上 xx,然后将 xx 从这个数组中删去。最大化 sumsum

1n,k30001\le n,k\le 3000,所有数组长度之和不超过 10610^6,值域 [0,108][0,10^8]

首先最多只有一个数组不是全选的,因为若存在两个数组 a,ba,b 不是全选,假设选择了 a[1,x]a_{[1,x]}b[1,y]b_{[1,y]},则一定有 ax+1<bya_{x+1}<b_y,否则可以撤销 yyx+1x+1,那么由于 ax<ax+1,ay<ay+1a_x<a_{x+1},a_y<a_{y+1} 故一定有 ax<by+1a_x<b_{y+1},所以此时撤销 xxy+1y+1 是优的,矛盾。

那么问题变成了扣掉一个物品的 01 背包,这个是经典问题,可以做到 O(nklogn)O(nk\log n)。具体的,考虑类似线段树一样分治,处理区间 [l,r][l,r] 的时候先加入 [l,mid][l,mid] 中的物品,递归右半边;再撤销掉 [l,mid][l,mid] 中的物品(通过开桶记录加入前的状态实现),递归左半边。这样递归到单点的时候就求出了答案。

时间复杂度是 T(n)=O(nk)+2T(n2)=O(nklogn)T(n)=O(nk)+2T(\frac{n}{2})=O(nk\log n) 的。