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\) 表示类型是有顺序的,要按每个类型的第一次改变的增量从小到大排序。

其实这种题的状态最重要的是做到不重不漏,每个转移需要钦定很多东西。

posted @ 2024-10-31 12:16  LarrixAntofanin  阅读(16)  评论(1)    收藏  举报