【題解】牛客練習賽41-D 最小相似度

題目鏈接

\(\text{Solution:}\)

首先考慮我們到底要求啥,實際就是要快速求出對於一個數 \(x,\) 所有數與它異或後的 SIM 值。

一種 naive 的想法是直接枚舉 \(T,\) 顯然複雜度爆炸,因爲 \(n\) 太大了,是 \(O(2^m\times n)\) 的。

考慮把 \(n\) 幹掉,倒着想。題目的描述引導我們去二分答案。

設當前答案是 \(mid,\) 目標就是看是否存在一個 \(x\) 滿足最大 SIM 不超過 \(x.\)

考慮設 \(f_x\) 表示 \(x\) 在二進制下 \(0\) 的個數,尋找一個逆向的突破口:

不能直接枚舉 \(x,\) 考慮什麼情況下我們可以知道存在這樣一個 \(x.\)

那麼發現,每個數 \(v_i\) 在經過變換後的值就是 \(v_i\text{ xor } x,\) 那不妨從這個最終狀態出發。

考慮預處理出所有二進制下 \(0\) 的個數等於 \(i\) 的數,那麼設 \(g_x\) 表示 \(x\) 這個數是否有貢獻,那麼把 \(cnt\leq mid\) 的貢獻都算上,現在我們就有了兩個多項式:

\[f,g \]

那麼設 \(c,c_x=\sum_{i\text{ xor }j=x}f_i\times g_j\)

那麼存在一個 \(x\) ,就意味着 \(c_x=n,\) 因爲這就等價於它對每個數都有貢獻。

從上述做法就可以二分答案了。複雜度 \(O(m2^m\times \log m)\)

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