根號算法
一種優美的暴力(?
RMQ問題
求區間最小值
RMQ問題
求區間最小值
把長度為n的陣列切成a塊,每一段的長度是\(\frac n a\)
RMQ問題
求區間最小值
把長度為n的陣列切成a塊,每一段的長度是\(\frac n a\)
可以先算出每一塊內的最小值
對於每一筆詢問(l, r)
可以知道只有左右兩端的兩塊不會完全覆蓋
RMQ問題
求區間最小值
把長度為n的陣列切成a塊,每一段的長度是\(\frac n a\)
對於中間被完全覆蓋的區間,可以直接得到每一塊的最小值
最多只有a塊,\(O(a)\)
RMQ問題
求區間最小值
把長度為n的陣列切成a塊,每一段的長度是\(\frac n a\)
對於沒有被完全覆蓋的部分,
可以暴力的直接去找每一個
取最小值,一段的長度最多\(\frac n a\)
\(O(\frac n a)\)
一筆詢問的複雜度\(O(a + \frac n a)\)
RMQ問題
求區間最小值
把長度為n的陣列切成a塊,每一段的長度是\(\frac n a\)
\(O(a + \frac n a)\)
透過算幾不等式
\(a + \frac n a \geq 2\sqrt{a\frac n a}\)
\(a + \frac n a \geq 2\sqrt n\)
當等式成立時,\(a = \sqrt n\)
對於一個n點m邊的圖
計算長度為3的環的數量
數三角形
先想想有哪些方法
數三角形
先想想有哪些方法
- 對於一個點,枚舉兩個跟這個點相連的邊
 
看這兩個邊的另一端有沒有相連\(O(d^2)\)
- 對於一個點,枚舉每一條邊,看這條邊的兩端有沒有都跟這個點相連\(O(m)\)
 
數三角形
先想想有哪些方法
因為總點度是\(2m\)
所以我們把點分成輕點和重點
- 輕點:\(d\leq \sqrt {2m}\)
 - 重點:\(d> \sqrt{2m}\)
 
數三角形
先想想有哪些方法
因為總點度是\(2m\)
所以我們把點分成輕點和重點
- 對於輕點我們用第一種方法\(O(m\sqrt m)\)
 - 對於重點我們用第二種方法\(O(m\sqrt m)\)
 
\(O(m\sqrt m)\)
莫隊
用於處理區間詢問的離線算法
條件
要可以很快的把一個[l, r]區間的答案
變成[l - 1, r], [l, r - 1], [l + 1, r],[l, r + 1]的答案
莫隊
假設詢問都在一個長度為n的序列
把所有詢問照左界排序
接著把每\(\sqrt n\)分成一組
對每一組內的詢問的右界排序
根號算法
By scottchou
根號算法
- 74