CF1817E Half-sum 另解与 Trygub Number

一题水两篇怎么说。

上一篇中我们采用智慧方法减少了比较次数,避免了使用复杂的高精度数。现在我们有高论!可以做到 O(logBVlog2n) 在某一位加或者减一个大小 O(V) 的数,支持判断正负和取特定位的值。怎么做呢。很简单,我们每一位的数值域原本是 [0,B),其中 B 是进制,现在我们改成 (B,B)。你发现这样一个数的正负性依然只和最高非零位置有关,某一位的具体值,只会受到上一个非零位的退位影响,那么用 set 存一下非零位置即可。在这道题,加的数是 5×108。进行一个位的压,那么你可以把 V 搞到 Θ(B),于是单 log 就暴力过了这个题。下面证明为啥加减这么快!

考虑当前我们在某一位要加上一个数 X,如果 |X|B 那么它会除以 B 下取整以后再被扔到下一位;由于当前位可能有数所以它的大小还可能增加 1,但是由于级数 i=0Bi 狠狠地收敛,所以 |X|B 的时候这个增加 1 没有啥存在感。这一部分消耗的复杂度也就是 logBVlog2n(后一个 log 来自对 set 的操作)。那么考虑 |X|<B 的时候会发生啥。容易得出你会往前进位,进的数只可能是 ±1,单次消耗复杂度是 log2n。于是一般的时候你就停下来了,但是也有可能不停进位,发生链式反应!也就是当某一位恰好是 ±(B1) 的时候。定义这样的位是“临界状态”位。那么发生一次额外的进位消耗至少一个临界状态的位。于是你考虑均摊分析。什么时候我们会增加临界状态的位呢?容易得出,前面当 |X|B 的时候每一次都可能增加一个,而在进位过程中,我们顶多在最后一次进位停下来的时候产生一个临界位。所以最后临界位的总个数是均摊 logBV 的。那么均摊复杂度正确,完全胜利!

贴一下 CF 上的原文

posted @   kyEEcccccc  阅读(34)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示