首页 > 其他 > 详细

水站 题解

时间:2020-07-16 15:40:24      阅读:17      评论:0      收藏:0      [点我收藏+]

(HZOI2019)水站 题解

by rvalue

看到题目首先考虑最优解是长啥样的

构造一下就会发现最优解一定是从一个 \(i(1\leq i\leq n)\) 开始一直放水放到 \(n\) . 因为如果中间有中断的话只有最后连续的一段对第 \(n\) 层是有影响的

那么可以想到一个朴素的 \(O(n^2)\) 暴力, 即枚举这个 \(i\) 然后模拟放水过程, 能自动放就自动放, 不能就花钱放.

原数据范围 \((1.5\times 10^4)\) 这样实际上就可以过了, 因为常数非常小

接着考虑一个常用思想, 就是计算某个费用会在什么情况下产生贡献.

我们定义 \(c_i\) 为从第 \(i\) 层开始放水一直放到第 \(n\) 层所需的费用. 考虑第 \(k\) 层的强制放水花费会对整个 \(\left\langle c_i \right \rangle\) 产生什么样的影响. 显然有当且仅当从第 \(i\) 层到第 \(k\) 层的总水量都不足以使第 \(k\) 层自动减压时 \(c_i\) 中会包含第 \(k\) 层的强制放水费用. 因为当 \(k\) 不变时总水量随着 \(i\) 的减少而单调增加, 所以合法的 \(i\) 必然是比 \(k\) 小的连续一段, 二分找到最小的 \(i\) , 把最小的 \(i\)\(k\) 之间的所有 \(c_i\) 都加上 \(k\) 的花费即可. 而这个操作可以通过简单的前缀和解决. 总时间复杂度是 \(O(n\log n)\).

水站 题解

原文:https://www.cnblogs.com/rvalue/p/13322258.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!