NOIP2024集训Day63
A. 荷马史诗
相当于是 \(k\) 叉哈夫曼树的板题。建出哈夫曼树的同时求的 \(WPL\) 和最深叶子结点的深度就是答案。
B. Exercise Deadlines
做过。
C. 洗衣服
注意到洗衣服和烘干完全可以分开考虑。
贪心的使每个衣服被洗完的时间尽量早,分别用优先队列维护每件衣物被洗完和被烘干的最早时间,再大配小算答案就行了。
D. 菜肴制作
做过。
E. 兔子与樱花
一个自叶子到根的贪心。
考虑到如果一个节点原本可以被删除,加到它的父亲上去,而由于它的一个儿子被删除了,使其不能被删除,那直接不删它就好了。因为无论怎样贡献都是 \(1\)。
那么把每个点的权值设为 \(c[i]+son(i)\),要删它就把它加到它的父亲上去。从下往上遍历树,对儿子的权值排个序,能删就删,累加答案就行了。
F. Shopping Plans
贪心求第 k 大的终极应用。
有一个经典策略,用堆来维护每个答案的状态,当一个状态从堆里取出来后再转移,这样的话有用的状态数就只有 \(k \times\) 常数级别。
这道题就是分别用两个堆来维护,一个大的堆维护总的状态。\((cr,id,dt)\) 表示当前遍历到了类型 \(cr\) 的第 \(id\) 个状态,权值为 \(dt\)。要么往后要么还在当前这个类型转移就行了。
对于每个类型里再用一个堆维护,\((l,id,r,dt)\) 表示当前这个类型可以改变的范围在 \([l,r]\) 之间,目前改到了 \(id\),权值为 \(dt\)。考虑可以动 \(id\) 和 \(l\),或再加一个数近来转移。最后用一个 \(vector\) 来保存当前类型的第 \(i\) 个状态,只有转移需要的时候再往后从当前类型的堆里拿一个就行了。
值得注意的是大堆里的 \(cr\) 表示类型是有顺序的,要按每个类型的第一次改变的增量从小到大排序。
其实这种题的状态最重要的是做到不重不漏,每个转移需要钦定很多东西。