AHOI 2022 做題記錄
阿新 • • 發佈:2022-05-11
T1 P8338 [AHOI2022] 排列
T2 P8339 [AHOI2022] 鑰匙
T3 P8340 [AHOI2022] 山河重整
首先有一個很顯然的 \(O(n^2)\) dp:
令 \(f_{i,j}\) 為使用了前 \(i\) 個數字,目前最多可以湊出字首 \([1,j]\) 的方案數,轉移只需要新加入的區間拼的上就好了。
實際上,轉移時的限制可以寫作“集合中 \(\leqslant k\) 的數之和要 \(\geqslant k\)”。於是我們考慮容斥,我們找到第一個不滿足的位置 \(p\) 進行轉移,並乘上 \(-1\) 的係數。
此時有一個很好的性質,由於 \(p\)
那麼就可以把 dp 變成一維的,令 \(f_i\) 為 \([1,i]\) 內的數,和恰好為 \(i\) 的方案的容斥係數之和。它的計算可以用正常的整數拆分減去 \(f\) 帶來的容斥轉移。
這一型別的 dp 有一個很經典的優化到揹包的方法,我們可以類似 P6189 [NOI Online #1 入門組] 跑步,一次要麼加入一個欽定不滿足的數字,要麼給全域性加若干次一,可以發現只會加入至多根號個數字,所以做這個 dp 的複雜度是 \(O(n\sqrt n)\) 的。
但是我們在轉移前必須把轉移過來的 dp 值提前計算完成,可以使用類似半線上卷積,每次先求出前一半的 dp 值,再轉移給後一半。
複雜度是 \(n\sqrt n+\frac{n\sqrt n}{2}+\frac{n\sqrt n}{4}+\cdots=O(n\sqrt n)\) 的。