Atcoder agc025F

做了几天也不会,最后弃疗看了题解。其实做法大概和题解差不多的,就是没想到势能分析后暴力复杂度是对的。。。
对于某一位,任意时刻两个数的值可能有四种状态( 00 00 00 01 01 01 10 10 10 11 11 11)。
考虑从低位往高位依次处理进位关系。假设我们当前处理到某一位,依次维护了更低的位对这一位进位的状态( 01 01 01 10 10 10 11 11 11)和时间。一个显然的暴力是依次处理所有的操作,并且求出对更高的位的进位以及这一位最后的结果,注意如果我们某一位初始时或经过某次操作后状态是 11 11 11,那么可以直接把状态变成 00 00 00并且下一位增加一个 11 11 11的进位,所以我们分析的时候不考虑 11 11 11状态。
可惜这个复杂度显然是假的,因为连续的一段 11 11 11进位到下一层也是相同长度的连续一段 11 11 11
仔细思考一下,我们可以给出如下优化后的算法:对于 01 01 01 10 10 10操作直接模拟,将连续的 11 11 11操作用链表缩起来。对于一段 11 11 11操作,如果操作前这一位的状态为 00 00 00,那么会对下一位仍然连续做相同长度的 11 11 11进位,可以直接计算贡献并得到下一层一个新的 11 11 11连续段;如果是 01 01 01 10 10 10,我们将链表拆开模拟,会对下一位交替做 01 01 01 10 10 10的进位。
如何分析这个算法的复杂度呢?我们考虑每个位处理的过程,对每个 01 01 01 10 10 10操作带 3 3 3的势能,每个 11 11 11操作带 4 4 4的势能,且当前状态每个 1 1 1的位也带上 2 2 2的势能。那么考虑遍历过程,如果遇到一个 01 01 01 10 10 10操作,不论操作前状态是哪个,操作后总势能必定减小 1 1 1,代价被支付了。如果遇到一段连续的 11 11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值