分塊演算法
———————————————————-
1.思想
如果我們需要對乙個特定的序列進行操作,那麼非常直觀、簡單的方法就是純暴力(不,那叫模擬)。
不過如果暴力能過的話,那就呵呵了。
所以我們要想一些比較高能的資料結構——分塊。
相比線段樹來說,分塊演算法比較難實現,但是只要深入理解,就可以實現了,只不過需要一些資料結構的輔助。
分塊實質來說就是把乙個序列切分,從而實現對查詢、查詢、替換等等操作的高效處理。
———————————————————-
2.輔助結構
我們知道,陣列的單點查詢時間為o(1),而插入為o(n)
鍊錶的單點查詢時間為o(n),而插入為o(1)
而在noip裡,vector總體來說是比陣列快的,所以我們可以用vector來儲存每塊,只不過如果讓插入也這用vector的話,那麼時間就不可理喻了。
插入的話,我們可以使用pair
通常要定義這兩個資料結構,簡單的話那個pair就不用了,這要根據題意定義。
———————————————————-
3.模版
操作:建塊(rebuild)
注意:一開始不必要建塊,但是要在過程中將序列分塊
用途:當當前塊太大時,可以使用此函式將乙個大塊**?1
2
3
4
5
6
7
8
9
10
11
12
13
14
void
rebuild()
int
blo2=sqrt(top);
for
(
int
i=1;i<=top;i++)
ve[(i-1)/blo2+1].push_back(st[i]);
m=(top-1)/blo2+1;
}
操作:區間加法(add)
用途:在需要操作區間加法時可以使用?1
2
3
4
5
6
7
8
9
10
void
add(
int
a,
int
b,
int
c)
操作:插入
注意:自己可以控制塊的大小
用途:插入元素?1
2
3
4
5
6
7
void
insert(
int
a,
int
b)
常用的分塊只有這幾個操作,更多操作可見hzwer
你——悟到了麼?
感謝 的部落格還有黃學長qwqorz
詳解? 分塊 未完
不得不說,分塊真是一種優雅的暴力。畢竟人家就是可以暴力掃 部分統計來做到根號複雜度,還能順手解決區間眾數這種線段樹不好解決的問題 博主的分塊全是跟著黃學長的部落格學的,所以本文不應該叫詳解,頂多是我對分塊的看法 我做分塊九題的心得體會 畢竟學長已經寫得非常好了 在此還是表達一下對黃學長的敬仰和感謝 ...
查詢演算法 分塊演算法
查詢演算法 分塊演算法 查詢演算法主要有三種 線性查詢 二分查詢 分塊查詢 線性查詢效率最慢,可對無序列表進行查詢 二分查詢效率最快,只能針對有序列表進行查詢 分塊查詢的思路 分塊查詢中,每個塊中元素不一定有序的,塊間是有序的。分塊又稱索引順序查詢,這是順序查詢的一種改進方法,用於在分塊有序表中進行...
分塊演算法總結
分塊演算法顧名思義,就是將乙個序列分成若干個部分 塊 來解決 線段樹也可以解決分塊的問題,但這裡只介紹分塊演算法 說是分塊,那麼一共要分幾塊呢?據機房dalao說,分成sqrt n 為每塊長度 這樣一來,假設有n個元素的序列,就有 ceil n sqrt n 塊 核心的資料結構 struct blo...