分塊這種思路很常見,就是把乙個數列劃分成k塊,然後在塊的基礎上進行操作。
假如每塊的大小為magic,那麼長度為n的數列則一共會劃分成ceil(n/magic)塊。這樣會有一些性質:
1.原數列第i個的塊號為i/magic,是塊內的第i%magic個(不過這一條沒有用)。
2.假如i%magic==0,說明i是第i/magic塊的起點,第i/magic塊的範圍是[i/magic, (i+1)/magic)。
下面是用分塊思想對乙個長為n的數列的操作:查詢子區間的最大值和修改某個點的值。
1const
int maxn = 50500;2
const
int magic = 10;3
intn, q;
4int
h[maxn], b[maxn];56
void
init() 11}
12}1314
int query(int l, int
r) 21
else24}
25return
ret;26}
2728
void update(int x, int
v) 36
}37 }
查詢之分塊查詢
分塊查詢又稱索引順序查詢,吸取順序查詢和折半查詢的優點 基本思想 將查詢表分為若干個子塊。塊內的元素可以無序,但塊件是有序的,即第乙個塊中的最大關鍵字小於第二塊中的所有關鍵字,依次類推。再建乙個索引表,索引表中的元素含有各塊的最大關鍵字和各塊中第乙個元素的位址,索引表按關鍵字有序排列。示意圖 查詢分...
數論基礎之分塊
i 1n n i sum n rfloor i 1n in 暴力?1.顯然可以使用o n o n o n 的做法暴力過去,但是資料大了肯定就涼了 2.如果取n 10的話 可以發現n i n in i的值分別是10,5,3,2,2,1,1,1,1,1 這些相同的數字豈不是可以使用區間長度 相同的數字來...
區間分塊系列
很好的分塊知識講解。可能涉及的幾個詞語解釋 區間 數列中連續一段的元素 區間操作 將某個區間 a,b 的所有元素進行某種改動的操作 塊 我們將數列劃分成若干個不相交的區間,每個區間稱為乙個塊 整塊 在乙個區間操作時,完整包含於區間的塊 不完整的塊 在乙個區間操作時,只有部分包含於區間的塊,即區間左右...