o_o 当前时间是:

11:37:13 AM

 

CF1495F

传送门

decription

给定 n 和长度为 n 的排列 p。在一个位置 i 可以采取如下行动:

  • 花费 ai 走到 i+1

  • 如果 pi 后存在一个 pj>pi,则可以花费 bi 跳到 j,否则可以花费 bi 跳到 n+1

希望最小化从 1n+1 的花费。此外还有限制:有必经点集合 S,必须经过 S 内每一个点。

m 次询问,每次询问的 S 都是上一次询问的 S 加上或删除一个元素。每次询问输出最小花费。

  • n,m2×105

  • 109ai,bi109

solution

S 集合是有序的且 S0=1,S|S|+1=n+1

第一步转化是求 1n+1 的最小花费转化成求 SiSi+1(0i|S|) 的花费和的最小值。每一部分是独立的,所以要求每一段的花费的最小值。

每次给集合 S 加点删点相当于加上或删除共三段的贡献。计算答案的差分数组就可以了(也就是三段最小花费带来的答案变化量)。

问题就变成了有 O(m) 次询问 [l,r],求 lr 的最小花费。

关键的一步是考虑把所有询问离线下来,右端点递增排序。

我们只需要顺次维护 1,2,3,n+1 位置为终点时它前面的点到它的最小花费。

考虑这个图的性质:设 nxti 表示第 i 个位置下一个比它大的位置(不存在则为 n+1),那么对于 i<j,pi>pj,一定有 nxtjnxti

这说明右端点为 r 的时候直接加边不会对之前加的边减小的花费造成影响。

直接树状数组维护就行了。

时间复杂度 O((n+m)logn)

code

Submission #231468601 - Codeforces

posted @   zzafanti  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示