AGC025F Addition and Andition
题意: 给定长度为
对他们进行
- 令
,并将 和 加上 。
求出
观察该操作的过程。
从高位到低位逐位查看,若
我们发现,对于发生"对1事件"的某个
于是,低位的操作的“影响”永远不会追上高位操作的“影响”(影响是个偏序),可以先计算高位。
仍然考虑从高位到低位进行处理,先计算
加入一个低位时,不断尝试进行判定事件(可能向高位引发连锁反应),最多进行
这个算法的复杂度仍是
讨论可能的操作,并观察影响。
若
① 若
,则消耗 并发生一次事件,使得 加一。 ② 若
,则 ,令 加一。 ③ 若
,则 ,令 加一。 ④ 若
,则 ,令 加一。
若
⑤ 若
, ,停止。 ⑥ 若
,则 ,消耗 并发生一次事件,令 加一。 ⑦ 若
,则 ,令 加一。
能够发现,对于 ⑤,一轮只会发生
综上,除情况 ① 之外,其余情况的发生次数均摊
对于情况 ①,只需在操作时快速跳过连续的 std::set
维护。
总复杂度