CTS2025Day1T1 倾诉
以下定义 。
首先结构一定是形如将整个序列划分成若干子段,形如 的结构,其中 ,并且 严格单调递增,那么这一段的操作次数就是 ,不妨令 表示对应的权值。由于 ,所以说明最后一段的权值一定 。所以我们可以说明一定存在一组解,满足 ,因为否则我们让 减小 ,则这一个段的权值依旧 ,同时还节省了 次操作次数,并且仍然满足 单调递增的限制,于是 只有 种。
考虑对 组 进行随机二分,每一次可以扔掉期望一半,假设当前随机取的中点为 。我们考虑 DP,令 表示当前最后一段满足 ,最小的操作次数,那么限制就变成了判断 即合法。
我们考虑从小到大枚举 ,将第一维滚动,然后在枚举 种 ,注意到 的权值随着 递减而递增,所以存在一个分界点 ,满足 ,。那么,我们就可以树状数组维护后缀 的 ,单点 chkmax,维护 DP。
现在问题转化成如何求出 。我们先在外层二分,那么现在我们只需要判断 和 的大小关系。我们考虑二分+哈希求出 LCP,考虑计算 。
我们令 ,这里是 次项的位置,然后分类讨论。
不难发现,我们只需要求出 的前缀和,以及一个区间的进位即可。这里说的一个区间的进位是指,对于 ,求出 。我们考虑对于 ,预处理即可。对于 ,我们发现由于这部分的贡献和 ,所以最多只会使得下取整的值增加 。注意到关于 减小是单调上升的,所以我们维护 表示 下取整的值会再额外增加 即可。这里求出 可以从左往右递推。
求出 LCP 之后考虑具体计算 那一位的值,只需要 即可。
这样,我们分析一下时间复杂度。
- 随机二分;
- ;
- 二分 ;
- 二分 LCP。
总共 个 ,时间复杂度 。
CTS 的评测机很慢,赛时进行了一些卡常:
- 二分 时,上下边界可以设成随机二分的上下边界,正确性显然。虽然这样不能改变时间复杂度,但是可以优化常数。具体来讲,这部分的开销变成了 ,带了 的常数;
- 二分 LCP 的时候,由于大概率 LCP 较小,所以可以使用倍增。具体来讲,先从 ,再从 ,实测本地随机数据能快超过一倍。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律