[AGC061E] Increment or XOR

lalaouye發表於2024-10-14

題目中涉及到了加法和異或,一個是進位加法,一個是不進位加法,顯得很不可做。

但是我們注意到加法只加 \(1\),如果產生進位了,那會將末尾的所有 \(1\) 推平成 \(0\),而如果沒有進位,則後面的位不會受到加法影響。

這啟發我們挖掘這道題的過程。我們發現這個過程形似可以從低位推到高位,並且過程中會有很多整個字尾全部為 \(0\) 的狀態。那麼我們可以將過程分成若干個階段階段,並且發現,在 \([0,i-1]\) 位還未產生進位時,處理 \([i,40]\) 位的異或操作是簡單的,只需要記錄每個異或操作次數的奇偶性即可,因為他們不會收到加法影響,那麼我們考慮 dp,設 \(f_{i,0/1,0/1,s}\) 表示考慮 \([0,i-1]\) 位,初始狀態是 \(S\) 或全 \(0\),末尾狀態是 \(T\) 或進位,異或操作的奇偶性為 \(S\),從初始狀態到末尾狀態的最小代價。

我們發現這個狀態設計是足夠的,現在考慮轉移。

首先,第 \(i\) 位若可以直接匹配狀態,直接轉移就行,挨個討論即可。

現在開始考慮需要多次進位的轉移。首先,由於會出現進位,若我們要轉移 \(f_{i+1,x,y,S}\),首先我們顯然要從 \(f_{i,x,1,S_0}\) 開始,然後,我們接下來將會進行一系列的異或和加法操作,在此過程中我們需控制進位只能在第 \(i\) 位進位,不能影響到最後的位置。最後,我們再以一個 \(f_{i,1,y,S_{m+1}}\) 的操作完成轉移,\(m\) 表示中間的綜合操作的次數,那麼轉移方程就呼之欲出了:

\[f_{i+1,x,y,\bigoplus_{j=0}^{m+1} S_j}=f_{i,x,1,S_0}+f_{i,1,y,S_{m+1}}+\sum_{j=1}^m f_{i,1,1,S_j} \]

我們發現這個轉移的形式其實是一個最短路形式,那麼我們可以用 dijkstra 的方式去轉移,最後答案為 \(\min(f_{40,0,0,S})\),時間複雜度 \(\mathcal{O}(2^{2n}\log V)\)

相關文章