专栏文章

CF2086E 题解

CF2086E题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mipgx0ht
此快照首次捕获于
2025/12/03 11:49
3 个月前
此快照最后确认于
2025/12/03 11:49
3 个月前
查看原文
首先,容易发现 101810^{18} 以内的 Zebra-like number 就 3030 个,设从小到大第 ii 个为 aia_i,由定义易得 ai=4ai1+1a_i=4a_{i-1}+1
然后发现问题:用大的 aia_i 总是不劣的,因为我们省掉了 4×ai14\times a_{i-1},而“去掉”11 带来的影响无非就是拆掉一个 aja_j 换成 4×aj14\times a_{j-1}
所以“计算一个数的 zebra value”这个问题具有贪心性质。
考虑记忆化搜索,设 vi,jv_{i,j} 表示 ii 以内 zebra value 为 jj 的数的个数,那么设 axa_x 为小于 ii 的最大的 Zebra-like number,则 vi,j=viax,j1+vax,jv_{i,j}=v_{i-a_x,j-1}+v_{a_x,j},这个式子的含义是:[ax,i][a_x,i] 以内的数的 zebra value 可以先贪心的除去一个最大值,变为 [0,iax][0,i-a_x] 内的数,再加一,其余的数直接递归处理。axa_x 不会小于 i4\frac{i}{4}ax1=4ax1a_x-1={4a_{x-1}},所以两次递归后 ii 必然缩小最少 14\frac{1}{4},递归层数是 O(logn)O(\log n) 的,理论上能卡到 O(rlogr)O(r\log r) 直接 102010^{20} TLE 飞,但实际上完全跑不满,再加上记忆化,实际快的飞起,卡满在 CF 评测机上大概 60ms60\operatorname{ms}

关于复杂度

“跑不满”当然是一个很不严谨的说法,所以接下来让我们具体证一下。
首先,根据上面的贪心性质,易知一个数最多由 30×4=12030\times 4=120 个 Zebra-like number 组成(实际上这个界也不满),更严谨的说,是 O(logV)O(\log V) 个(其中 VV 为值域),因为这个界内最多 O(logV)O(\log V) 个 Zebra-like number,一个数中每个不超过 44 次。
所以 kk 的(有意义的)范围是 O(logV)O(\log V) 的,具体多少就不算了。
对于 vax1,jv_{a_x-1,j},我们一旦算出了所有 vax1,jv_{a_x-1,j},这部分就 O(1)O(1) 了,所以我们每次实际上相当于只往一侧递归,x,jx,j 的范围又是 O(logV)O(\log V) 的,所以我们的总复杂度实际上控制在了 O(log2V)O(\log ^2V) 左右。

评论

1 条评论,欢迎与作者交流。

正在加载评论...