题解:AT_agc061_e [AGC061E] Increment or XOR

posted on 2025-02-06 13:44:58 | under | source

做法就是记 \(f_{i,st,ed,msk}\) 为只考虑 \([0,i)\) 位(这样记主要是避免 \(-1\)),当初始状态为 \(st=0/1\)\(1\) 代表和 \(S\) 串一样、\(0\) 代表全清空为 \(0\);变化为结束状态 \(ed=0/1\)\(1\) 代表和 \(T\) 串一样且不允许向上进位,\(0\) 代表全清空为 \(0\) 但是向 \(i\) 位进一位;且过程中 \(Y\) 集合的异或情况为 \(msk\) 时(用于概括对更高位的影响),最小的代价。注意我们认为先异或后进位,即进位是最后一次操作。

为啥要这样设计 \(st,ed\) 呢?因为你注意到假如进位的话,变化过程形如 \(S\to 0\to T\),而进位的话就意味着会全被清空为 \(0\),所以设立其为中继状态就能很方便地刻画进位了。

转移如下,考虑 \(f(i)\to f(i+1)\),分讨是否产生新的进位:

  • 不进位:要求在原先基础上即可满足状态 \(f(i+1)\) 的结束态,那么就能 \(f(i+1)\gets f(i)\)
  • 进位:根据先前讨论,可以分为三步走:
  • \(f_{i,st,0,msk_1}\) 对应 \(S\to 0\) 这一步,注意操作后 \(i\) 位需要是 \(1\),且不能影响更高位。
  • 若干 \(f_{i,0,0,msk_i}\),目的是修改 \(msk\) 但是通过加一抵消影响,注意操作后 \(i\) 为需要是 \(1\),且不能影响更高位。
  • \(f_{i,0,ed,msk_k}\) 对应 \(0\to T\) 这一步,需满足 \(ed\) 对应的限制。例如要进位就要保证异或后 \(i\) 位为 \(1\) 从而加一进位。最终得到的 \(msk\) 即为 \(msk_1\dots msk_k\) 的异或和。

瓶颈在于进位的转移,发现形如最短路,直接优化即可。复杂度 \(O(4^n\log V)\)

总结:

  • 划分阶段以消除后效性。
  • 处理带进位的数位 dp 问题时,考虑将 \(+1\) 进位这件事视为一个阶段,钦定除最后一次向 \(i\) 进一位外不能对后 \(i\) 位造成影响,这样不断地从低位拓展到高位。本题就以这种方式巧妙地处理了“异或”与“加法”这两种看似完全不相干的操作。
posted @ 2026-01-15 08:14  Zwi  阅读(3)  评论(0)    收藏  举报