P2541 [USACO16DEC] Robotic Cow Herd P 题解 / 最小扩展过程贪心学习笔记
:::::info[题目基本信息]
考察:Ad-hoc(省选/NOI-)。
题目简介:
给定
数据范围:
-
1\le n,k\le 10^5 -
\forall i\in[1,n],1\le len_i\le 10 -
\forall i\in[1,n],j\in[1,len_i],1\le a_{i,j}\le 10^8
时间限制:1s 至 3s。
空间限制:250MB。
:::::
首先我们可以想到通过一个
我们考虑一行一行扩展,这时容易发现若设目前处理的行为
- 扩展到下一列(前提为
y\ne len_x ),同时令y\leftarrow y+1,w\leftarrow w-a_{x,y}+a_{x,y+1} 。 - 跳到下一行(前提为
x\ne n ),令x\leftarrow x+1 。
但是这样还是不行,每次扩展会直接跳到最后一行,相当于多了
所以我们考虑把跳行这一步省略掉,只在扩展后跳行,这样我们扩展时也能一步扩展,画出来就是这样的一棵递归树(为了清晰,我们以
这是一棵多叉树,叉数最多能达到
现在我们唯一的需求就是减少叉数,我们想到可以左儿子右兄弟表示法,更改一下是这样的:
这时就有了一些状态转移方式,为了方便统一,我们把类似
然后我们就做完了这道题,但是还有若干细节。
:::::warning[细节]
- 为了保证优先队列求第
k 小的正确性,我们要保证后面出现的值不小于前面出现的值,具体地:- 对于每个数列,将其从小到大排序。
- 对于这
n 个数列,将它们按照a_{i,2}-a_{i,1} 从小到大排序。
- 上面的扩展方式只适用于
len_i\ne 1 ,对于len_i=1 ,我们要手动计算答案并把它剔除。
::::: 时间复杂度为\Theta(k\log k+nV) ,空间复杂度为\Theta(nV) 。
code