专栏文章
CF2086E 题解
CF2086E题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mipgx0ht
- 此快照首次捕获于
- 2025/12/03 11:49 3 个月前
- 此快照最后确认于
- 2025/12/03 11:49 3 个月前
首先,容易发现 以内的 Zebra-like number 就 个,设从小到大第 个为 ,由定义易得 。
然后发现问题:用大的 总是不劣的,因为我们省掉了 ,而“去掉” 带来的影响无非就是拆掉一个 换成 。
所以“计算一个数的 zebra value”这个问题具有贪心性质。
考虑记忆化搜索,设 表示 以内 zebra value 为 的数的个数,那么设 为小于 的最大的 Zebra-like number,则 ,这个式子的含义是: 以内的数的 zebra value 可以先贪心的除去一个最大值,变为 内的数,再加一,其余的数直接递归处理。 不会小于 ,,所以两次递归后 必然缩小最少 ,递归层数是 的,理论上能卡到 直接 TLE 飞,但实际上完全跑不满,再加上记忆化,实际快的飞起,卡满在 CF 评测机上大概 。
关于复杂度
“跑不满”当然是一个很不严谨的说法,所以接下来让我们具体证一下。
首先,根据上面的贪心性质,易知一个数最多由 个 Zebra-like number 组成(实际上这个界也不满),更严谨的说,是 个(其中 为值域),因为这个界内最多 个 Zebra-like number,一个数中每个不超过 次。
所以 的(有意义的)范围是 的,具体多少就不算了。
对于 ,我们一旦算出了所有 ,这部分就 了,所以我们每次实际上相当于只往一侧递归, 的范围又是 的,所以我们的总复杂度实际上控制在了 左右。
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...