【meet in the mid】【qbxt2019csp刷題班day1C】birthday

Description

給定一個長度爲 \(n\) 序列,值域爲 \([1, v]\),每次選擇一段區間,要求在這個區間上選擇一些元素加入到兩個集合中,每個元素要麼不選要麼只能加入一個集合,要求兩個集合非空且元素和相等,問能否實現。

同時要求區間修改元素爲自身的立方對 \(v\) 取模的結果。

Limatations

\(1 \leq n \leq 10^5\)\(1 \leq v \leq 1000\)

Solution

考慮一段長度爲 \(len\) 的區間,考慮每個點有選入集合和不選入集合兩種可能,所以所有選擇的種數一共有 \(2^{len}\) 種。考慮由於值域爲 \(v\),所以可能出現的權值和一共有 \(len \times v\) 種。考慮當 \(2^{len} > len \times v\) 時,一定至少有兩個不同的選擇得到了相同的權值。考慮這兩個選擇可能會選擇相同的元素,那麼直接將這些相同的元素都去掉,由於去掉的元素相同,最終得到的權值和依然是相同的,並且兩個集合無交。因此這種情況一定能實現。

解方程

\[2^{len} > len \times v\]

兩側同時取 \(\log\),整理得

\[len - \log len > \log v\]

顯然 \(v\) 取最大值時,左側取最大值,因此有

\[len - \log len > 10\]

顯然當 \(len\) 充分大時,左側的值與 \(len\) 正相關,枚舉 \(len\) 得到

\[len > 13\]

因此當 \(len \geq 14\) 時,可以直接輸出 \(Yes\),下面考慮 \(len \leq 13\) 的情況。

考慮最簡單的方法是爆搜,枚舉每個元素不選還是選入集合 \(A\) 還是選入集合 \(B\),時間複雜度 \(O(3^{len})\),由於一共有 \(m\) 次查詢,時間複雜度超標。

考慮進行 meet in the middle,先搜索區間前 \(6\) 個元素的所有情況,記錄所有可能的 \(A\) \(B\) 兩集合元素和之差,再搜索區間後 \(7\) 個元素的情況,同樣記錄所有可能的元素和之差。一旦有一個差在兩側都有出現,那麼只需要一個集合左邊選較大的右邊選較小的;另一個集合左邊選較小的右邊選較大的,即可得到兩個合法的集合,反之則不能得到。

因此這這樣的複雜度爲 \(O(2^{len / 2})\),由於有 \(m\) 次操作,實際運算量與 \(2^7 \times m\) 同階,可以通過本題。

考慮區間修改操作,只需要分塊或者線段樹即可快速維護。

Summary

zxy 天下第一

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章