[學習筆記] 淺析cdq分治
阿新 • • 發佈:2021-08-29
正如其名, cdq分治是一種分治演算法, 通常用於解決受限制的離線貢獻問題
這個演算法通過分治, 不斷地將要處理的區間分成左區間和右區間, 然後統計這兩個區間之間的互相貢獻
在這個過程中, 我們需要保證這兩個區間的東西確實是能互相產生貢獻的兩類東西
如何做到呢? 許多時候在cdq前排個序就行
這樣一層一層的分治下去, 便能以 \(O(log(n) * solve(len = n))\) 的時間複雜度解決問題
本質上, cdq分治將多餘的貢獻計算合併在了一起, 進而優化了時間複雜度
具體來說, 區間 \([mid + 1, r]\) 的東西都能對區間 \([l, mid]\) 的東西產生相似的貢獻, 於是我們將這貢獻一塊兒以較快的方法求出, 這樣就顯然會比暴力列舉一個數從其他數得到的貢獻要快
似乎解決許多奇怪的問題也可以借鑑cdq分治的思想
例題:(打√的是蒟蒻博主做過的QWQ)
P1908 √
P4169 √
P3810 √