Atcoder agc025F

博客讲述了通过势能分析优化算法解决Atcoder agc025F问题的过程。作者最初尝试暴力求解但发现复杂度不正确,然后分析得出对于01, 10和连续11的操作,采用特定策略进行优化。通过为不同操作和状态赋予势能,证明了优化后的算法复杂度为O(N+M+K),其中N, M, K分别为题目中的相关参数。" 112398330,10545983,Flex布局详解:Vue中实现垂直居中与居上,"['前端开发', 'CSS', 'Vue', 'flex布局']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值