題目傳送門
如果是普通多重揹包的話時間複雜度是o(v
∑m
)o(v\sum m)
o(v∑m)
的,過不去……
於是考慮二進位制分組,即將m
im_i
mi寫成∑2i
+k
\sum 2^i+k
∑2i+
k的形式,這樣由於任意正整數可以寫成一系列二進位制的和,所以正確性可以保證。
這樣,每一組的物品數由m
im_i
mi降至了log2
mi
\log_2 m_i
log2m
i,這樣再做01揹包,複雜度是o(v
∑log2
mi
)o(v\sum \log_2m_i)
o(v∑
log2m
i),這樣就很滋磁了!
當然還有單調佇列優化多重揹包至o(v
n)
o(vn)
o(vn
)的,只要題目不卡二進位制優化這個單調佇列優化也沒什麼用途……(不過真有卡的題……)
code
二進位制分組擴充套件
最近才發現的乙個套路,以前以為二進位制分組只能搞揹包,結果發現還有一些更為優秀的操作。我們對於乙個不支援動態操作的資料結構,拆分為 log 個,然後每次加入元素加入到乙個新的組中,如果最新的兩個資料結構元素個數相等,就合併兩個元素。然後暴力重構這個合併得到的資料結構。然後查詢的時候就查詢每乙個分組內...
二進位制 二進位制起源
現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...
學習筆記 二進位制分組
ac自動機 二進位制分組。利用二進位制分組思想,維護乙個 siz 從大到小的單調棧,若 siz siz 就一直暴力合併兩個 ac 自動機並求出新 ac 自動機的 fail 指標。code below include using namespace std const int maxn 300000 ...