1. 程式人生 > 其它 >[學習筆記] 淺析cdq分治

[學習筆記] 淺析cdq分治

正如其名, cdq分治是一種分治演算法, 通常用於解決受限制的離線貢獻問題

這個演算法通過分治, 不斷地將要處理的區間分成左區間和右區間, 然後統計這兩個區間之間的互相貢獻

在這個過程中, 我們需要保證這兩個區間的東西確實是能互相產生貢獻的兩類東西

如何做到呢? 許多時候在cdq前排個序就行

這樣一層一層的分治下去, 便能以 \(O(log(n) * solve(len = n))\) 的時間複雜度解決問題

本質上, cdq分治將多餘的貢獻計算合併在了一起, 進而優化了時間複雜度

具體來說, 區間 \([mid + 1, r]\) 的東西都能對區間 \([l, mid]\) 的東西產生相似的貢獻, 於是我們將這貢獻一塊兒以較快的方法求出, 這樣就顯然會比暴力列舉一個數從其他數得到的貢獻要快

似乎解決許多奇怪的問題也可以借鑑cdq分治的思想

例題:(打√的是蒟蒻博主做過的QWQ)

P1908

P4169

P4093

P2487

P4027

P3810