在我不知道分塊以前,我一直以為分塊是乙個非常牛逼的東西。在我多次學習並且處於懵逼狀態的時候,我一直以為這輩子我不會分塊了。直到一天我學會了他。
(ps:乙個小建議,學習新知識要在上午哦)
下面我就把剛剛學會的分塊做了一下總結。
主要思想:
分塊是乙個很暴力的演算法,跟普通的列舉暴力差不了多少。
對於乙個長度為n的序列,我們可以講其中的元素分為m個連續的子串行,每塊的長度自然就為n/m。我們在更新一段區間[l,r]是,可以先更新l到l所在塊的右端點和r所在塊的左端點到r。即下圖中紅色的區域,每塊中最多有n/m個元素,所以這一操作的複雜度的為n/m。
然後我們在成段更新剛才更新的塊中間的那些塊(即上圖中紅色區域中間的那些塊),這些塊最多為n塊,所以這一操作的複雜度為m。
總操作的複雜度即為m+n/m,根據均值不等式可知,m=sqrt(n)時複雜度最新。
下面的就是模板(原諒我草率的寫完,因為這東西是真的沒有好寫的)
1 #include2 #include3 #include4 #include5 #include6 #include7例題:loj數列分塊入門一using
namespace
std;
8const
int n = 100000;9
intgro[n],blo,n,v[n],tag[n];
10void add(int a,int b,int
c)11
20int ask(int a,int b,int
c)21
//暴力詢問即可
27int
main()
2840 }
loj數列分塊入門二
分塊 學習筆記
當我們對於乙個很大陣列 1e5 進行區間修改和區間查詢時,我們會想到線段樹的 nlog n 的優秀效率。分塊 優雅的暴力!我們將區間分成每個大小為 s 的小塊,這樣我們的複雜度就會從 n 降到 frac n s 的效率。我們先將陣列分成長度為 s 小塊,用原下標除以 s 向上取整,就是他分塊後的小塊...
分塊 學習筆記
前言 內容參考自感謝。分塊,是一種優雅的暴力,它通過對數列分段,完成對數列一些區間操作和區間查詢的操作,是一種根號演算法。本文屬於分塊入門筆記,旨在零基礎的同學學會分塊。1 建塊 在建塊伊始,我們需要完成一下幾個任務 1.確定塊的大小 2.確定塊的數量 3.標記每個塊的左右邊界 4.標記每個元素所屬...
分塊學習筆記
題面傳送門 演算法簡介 分塊主要是乙個修改,維護區間的東西,它可以做到一邊修改一邊查詢,區間修改 o sqrt n 區間查詢 o sqrt n 單點修改 o 1 單點查詢 o 1 演算法實現 初始化 首先要把基本陣列 以下簡稱 a 陣列,長度為 n 分成 m 塊。一般是分成 sqrt n 塊,當然也...