根號算法

一種優美的暴力(?

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的環的數量

1\leq n \leq 10^5\\ 1\leq m \leq 10^5

數三角形

先想想有哪些方法

數三角形

先想想有哪些方法

  • 對於一個點,枚舉兩個跟這個點相連的邊

看這兩個邊的另一端有沒有相連\(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