CF1787H Codeforces Scoreboard 题解

可能更好的阅读体验
upd: 2023.11.9 突然想到想来修缮一下题解。
upd: 2024.10.16 感谢 @Mirasycle 指出了错误,官方题解已经更正。
什么时候给的黑,感觉应该不至于?
DP 优化部分感谢 @rsjw 的 slope trick 思路。

solution

首先不考虑对 aimax,显然直接按照 k 降序排序最优。
接下来考虑 ai 的限制,如果取到了 ai 一定放在最后面最优。
为了方便设 fi,j 为前 i 个,j 个数字不取 max,最后答案和 b 的差的最小值。
limi=biai

fi,j={fi1,j+limij=0min{fi1,j+limi,fi1,j1+ki×j}j>0

这样时间复杂度为 Θ(n2)

考虑优化。
首先对于样例输出一个整个 f
我们通过观察样例发现对于给定的 i,在 j 改变的时候是下凸的。
j 一维差分,设 gi,j=fi,jfi,j1(j>0)
我们可以发现 gigi+1 的变化似乎很有规律,可以试着直接用数据结构来优化这个转移(slope trick)。
我们利用 fi,j 的转移把 gi,j 的转移算出来
默认 1<j<i,将 fi,j=fi,0+k=1jgi,k 带入 fi,j 的递推式。

得到

fi,0+k=1jgi,k=min{fi1,0+k=1jgi1,k+limi,fi1,0+k=1j1gi1,k+ki×j}

化简得

limi+k=1jgi,k=k=1j1gi1,k+min{gi1,j+limi,ki×j}

对于上式用 j1 代替 j

limi+k=1j1gi,k=k=1j2gi1,k+min{gi1,j1+limi,ki×(j1)}

两式相减,得到

gi,j=gi1,j1+min{gi1,j+limi,ki×j}min{gi1,j1+limi,ki×(j1)}

由于 k 单调不增,对 i 归纳可以发现,对自变量 jgi1,j 的增长速度不会比 ki×j 慢。所以随着 j 的增大,存在一个分界点,使得 min{gi1,j+limi,ki×j} 前一段的取到 gi1,j,后一段取到 limi,ki×j

因此,从 gigi+1,分别是三段转移:第一段不变,第二段为新增加的一个数字,第三段区间加一个数。

最后答案为最大前缀和。

用平衡树维护这个变化过程,O(nlogn)

https://codeforces.com/contest/1787/submission/191206679

posted @   jiangtaizhe001  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示