1. 程式人生 > >【資料結構】二進位制分組解決一類強制線上問題

【資料結構】二進位制分組解決一類強制線上問題

Text

這種技巧來源於論文:許昊然《淺談資料結構題的幾個非經典解法》

你需要對什麼東西支援若干個修改和詢問操作,強制線上,如果去掉強制線上,那麼是可以對時間分治來解決的。

換句話說,這類題目滿足能夠對於每個修改單獨計算對每個詢問的答案(修改之間是獨立的) 我們將修改操作每2的冪次分一組,每一組用資料結構維護

當出現詢問時,就暴力跳每一組,在組中的資料結構查詢。 出現新的修改時,就類似2048(逃)一樣的向左合併組。

假設當前我們有13個修改操作,組的大小是8 4 1 新加入一個修改,變成8 4 1 1 合併就變成 8 4 2 以此類推。

合併組的時候就暴力重構這個資料結構

分析這樣的時間複雜度 論文中如是說

考慮我們加入第k個操作所需要重構的組的大小 可以發現其實就是lowbit(k)lowbit(k) 假設我們維護每一組的資料結構的複雜度為O(f(size))O(f(size)) 組數一定是不超過logk\log k組的,那麼總的詢問時間複雜度就是O(qlognf(n))O(q\log n*f(n)) 總的修改時間複雜度就是i=1nO(f(lowbit(k)))\sum\limits_{i=1}^{n}O(f(lowbit(k))) =i=1lognO(n2i+1

f(2i))=\sum\limits_{i=1}^{\log n}O\left(\left\lceil{n\over 2^{i+1}}\right\rceil *f(2^i)\right) i=1lognO(f(i))=O(f(n)logn)\leq\sum\limits_{i=1}^{\log n}O(f(i))=O(f(n)\log n)