CF2031
A
题意
给一个单调不增序列,每次操作可以单点修,问把序列变为单调不减序列需要的最小操作次数。
分析
注意到事实上我们需要修改的数字非常多。考虑一个中间点
B
题意
给一个排列,每次操作可以交换相邻且相差为
分析
一个关键性质是任何数不会被交换两次,这表明模拟这个过程的复杂度是线性的,那就按照题意模拟就行了。
如果两个数满足相差为
C
题意
构造一个长度为
- 任意元素至少出现两次;
- 同种元素的距离为完全平方数;
- 最大元素不超过
。
分析
考虑奇数的情况,发现我们不得不至少将一个数重复三遍,设三个出现的位置按顺序分别为
这是一个勾股定理的形式,不难发现最小的解为
无解的情况即对应奇数且
D
题意
给一个序列,兔子向更大的下标跳只能跳到更矮的位置,向更小的下标跳只能跳到更高的位置,问从每个
分析
首先答案的下界是前缀最大值。
考虑一个跳的策略:先向大下标跳到一个很矮的位置,再向小下标跳到一个很高的位置。这个过程可以重复以到达较靠后的位置。注意到这实际表明了前面的高的位置可以继承后面的矮的位置的答案,这启发我们倒着扫。
我们先把答案置为前缀最大值,然后从后往前扫,每个位置继承后面比自己矮的位置的答案,用单点修前缀 max 的 BIT 可以维护。
E
题意
假设初始有一棵根为
- 选择一条树边
,不妨令 为父亲; - 将所有
的儿子与 相连; - 删除节点
。
现在给定一棵已经被进行了一系列删除操作的树,问最少需要高度为多少的满二叉树才能通过若干次删除操作将满二叉树变为给定的树。
分析
从满二叉树开始考虑较为困难,我们可以从给定的数开始考虑如何还原回满二叉树。
注意到一个节点的儿子数量不大于
现在我们考虑儿子数量为
数量为
这表明儿子的合并不能简单贪心,我们转而在每个节点上开一个优先队列,每次将两个高度最小的节点合并,当剩余的节点只有两个时直接与父亲相连。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效