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 天下第一