CF1768F

dp+根号分治,配得上省选题的难度。

一眼 dp,虽然暴力肯定过不了,但是把朴素转移先列出来绝对没坏处。

dpi=min1j<i(dpj+minjkiak×v)

这个东西很难用 DS 维护,有 min 的存在又很难斜优啥的,就想到有一种方法优化:限制可行状态数。

假设要求从 i 跳到 j。若一步从 ij 是最优的,那么它的花费一定小于一步一步跳的花费,即

minikjak×(ij)2(ij)×n

这是因为值域上界为 n

化简一下,得到

minikjaknij

看到分数就可以想到根号分治。

  • ijn 时,暴力枚举 j 转移。时间复杂度 O(n)

  • ij>n 时,枚举 minikjak。又因为有一个性质:最优情况下一定有 k=ik=j。因为 ((ik)2+(kj)2)×ak(ij)2×ak。这时又可以分两种情况。

  • k=j 时,记录每一个 n 的数上一次出现的位置,每次枚举转移。时间复杂度 O(n)

  • k=i 时,如果 ain,从 i 往前暴力枚举转移,直到遇到一个 akai 为止。这一部分的复杂度呢?根据楼上大佬的说法,“对于 [1,n] 内的每个值,最多可能扫完整个序列一次”。所以均摊复杂度 O(n)

总时间复杂度 O(nn)。其他的不说,这个分讨的复杂度太优美了。

Submission

posted @   yinhee  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示