CF311B Cats Transport
特意单独拿出来单独写。
这道题的 DP 很好想到,我们考虑使用相对运动,就是算每个猫咪需要某管理员在什么时候出发正好接到。将这个东西排序之后,我们发现这个就转化成了在长为 的序列上分 段的一个问题,显然可以 2D/1D DP。
设 为排序后的 (将 归零),那么我们如果想要 计算一段的贡献就需要前缀和,设 为 的前缀和,那么有:
实际 DP 的时候是计算的 。设 为目前 个管理员把前 个猫接走的最小代价,有:
这个时候可以拆后面的贡献,发现有 ,那么有 ,然后发现 斜率单调插入,询问 也单调,那么可以斜率优化。
但是这个是一个分层斜率优化,所以我们也开层数个单调队列来应对,每一次调用上一层的单调队列并更新当前层的单调队列。这个时候就有可能出现转移时 的情况,但是稍加思索发现这样转移一定不优,所以在单调队列中它一定排在后面。
最后注意整数除法的向上取整的方法需要保证被除数是正数,否则要变号,所以这里推荐直接 double
计算后加 0.9999
,不然就自己讨论一下加入的直线的顺序以及比较的传参时的顺序。
时间复杂度 ,763ms,所以决策单调性的两种方法(分治与特殊分层优化)很难通过。
本文作者:xingyu_xuan
本文链接:https://www.cnblogs.com/xingyuxuan/p/18045359
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步