以前以為自己會證時間復雜度,后來考到原題發現自己證偽了,草。
從高到低確定 \(\sum b\) 的每一位是否可以為 \(0\)。
枚舉第 \(p\) 位是否可以為 \(0\) 時,比第 \(p\) 位低的位全部填 \(1\),比第 \(p\) 位高的保留不變,得到一個 \(\sum b\)。之后看是否存在一個 \(\{b_i\}\) 滿足要求。
相當於我們需要把 \(\sum b\) 的每個 \(1\) 分配給某個 \(i\)(也即,\(b_i\) 的這一位為 \(1\)),使得 \(a_i\leq b_i\)。
簡單的觀察:不妨設 \(a_1\geq a_2 \geq \dots \geq a_n\),則存在一個最優解滿足 \(b_1 \geq b_2 \geq \dots \geq b_n\)。
由觀察,考慮 \(\sum b\) 最高位的 \(1\),它一定分配給最大的 \(a_{max}\)。
如果 \(\sum b\) 的最高位 \(h\) 大於 \(a_{max}\) 的最高位 \(q\),則 \(a_{max}\) 接下來不需要被分配其他的 \(1\),直接刪掉。
如果 \(\sum b\) 的最高位 \(h\) 等於 \(a_{max}\) 的最高位 \(q\),則需要把 \(a_{max}\) 刪去最高位后再塞回去(如果刪掉最高位后非零的話)。
如果 \(\sum b\) 的最高位 \(h\) 小於 \(a_{max}\) 的最高位 \(q\),則不合法,此時 \(\sum b\) 的第 \(p\) 位填 \(0\)。
當然,如果把所有 \(a\) 都刪完了,則 \(\sum b\) 的第 \(p\) 位填 \(1\)。
顯然,這一過程不需要每次都從最高位開始掃 \(\sum b\),比 \(p\) 高的位的影響保留下來,可以從第 \(p - 1\) 位開始往后掃。
某時刻的某個 \(a\) 一定是初始時的某個 \(a_i\) 刪去最高的若干個 \(1\) 的情況,因此在過程中 \(a\) 的可能情況只有 \(O(\sum L)\) 種。
可以將這 \(O(\sum L)\) 種可能的 \(a\) 拿出來排序,具體來說由於只有長度相同的需要排,做個基數排序即可(當然,由於這部分不是瓶頸,你也可以嘗試一些 \(O((\sum L)\log(\sum L))\) 的排法)。
考慮某一時刻枚舉到 \(\sum b\) 的第 \(p\) 位。
設此時 \(a_1\geq a_2 \geq \dots \geq a_n\),並設 \(a_i\) 的最高位為 \(t_i\)。則合法的一個必要條件為 \(\forall i,p - i\geq t_i\)。
分配給 \(a_i\) 的 \(1\) 最大也只能是 \(p - i\),還有可能因為前面的數需要刪去最高位重新塞回來而變小。
另一方面,合法的一個充分條件為 \(\forall i, p - i > t_i\)。
此時所有數都可以直接被刪掉。
那么事實上需要檢驗的只有 \(p = \max\{i + t_i\}\) 的情況。
我們找到使得 \(i + t_i\) 最大的 \(i\) 中最小的 \(k = \min\{i\}\)。
如果 \(p = \max\{i + t_i\}\) 填 \(0\),則 \(a_1\sim a_k\) 分別對應了 \(\sum b\) 的第 \(p - 1 \sim p - k\) 位上有 \(1\)。
刪掉 \(a_1\sim a_k\),插入 \(a_k\) 刪去最高位后的 \(a'_k\),然后繼續找 \(p' = \max\{i + t_i\}\)。
如果 \(p - k > p'\),則前面的合法。
如果 \(p - k < p'\),則前面的不合法。
如果 \(p - k = p'\),我們令 \(p = p'\),令 \(k\) 為此時使得 \(i + t_i\) 最大的最小 \(i\),然后繼續遞歸檢驗。
可以使用線段樹維護查找最大值的過程。
然后可以證明,這樣遞歸的總次數不會超過 \(O(\sum L)\)。由於使用線段樹維護,總復雜度為 \(O(\sum L\log(\sum L))\)。
首先,相同長度的 \(a_i\) 只會有一個最大的 \(i + t_i\)。也即,我們每次選定的 \(a_{k'}\) 比上次遞歸進來的 \(a_k\) 對應的長度要短。
因此,如果最開始需要檢驗的是 \(p\),則遞歸次數實際上不會超過 \(O(L_p)\)。
而對於每個串,它只有一次是“最開始”檢驗的。因此得證。