分塊學習筆記

2022-05-11 13:55:18 字數 1987 閱讀 1496

題面傳送門

演算法簡介:

分塊主要是乙個修改,維護區間的東西,它可以做到一邊修改一邊查詢,區間修改 \(o(sqrt(n))\),

區間查詢 \(o(sqrt(n))\),單點修改$ o(1)\(,單點查詢\) o(1)$。

演算法實現:

初始化:首先要把基本陣列(以下簡稱 \(a\) 陣列,長度為\(n\))分成$ m $塊。一般是分成 \(\sqrt n\)塊,

當然也有題目要求不是這個。

基本過程(以分成 \(\sqrt n\)塊為例):當我們要單點修改 \(x\) 使其加上 \(y\) 時,直接在 \(a_x\)上加上

\(y\)。

當我們要區間修改 \(x\) 到\(y\) 使其加上 \(z\) 是,考慮三塊:開頭長度不超過 \(\sqrt n-1\) 的不完整塊,

中間的整塊,結尾的長度不超過 \(\sqrt n-1\) 的不完整塊,開頭長度不超過 \(\sqrt n-1\) 的不完整

塊與結尾的長度不超過 \(\sqrt n-1\) 的不完整塊直接在\(a\) 陣列上修改,並將懶惰陣列(以下簡稱

\(lazy\) 陣列,長度和 \(f\) 陣列一樣長)加上該區間修改個數\(\times y\),意為該區間非整塊修改累計修改的值,中間的整塊在乙個分塊陣列(以下簡稱 \(f\) 陣列,長度為\(\sqrt n\))上修改,其意義為這整塊

已經加上 \(z\)。

當我們要單點查詢 \(x\) 的值時,其值為 \(a_x+x\) 所在塊的 \(f\) 陣列的值。

當我們要區間查詢 \(x\) 到 \(y\) 的和時,仍然分成三塊: 開頭長度不超過 \(\sqrt n-1\) 的不完整塊,

中間的整塊,結尾的長度不超過 \(\sqrt n-1\) 的不完整塊,開頭長度不超過 \(\sqrt n-1\) 的不完整

塊與結尾的長度不超過 \(\sqrt n-1\) 的不完整塊直接對每個點單點查詢累加,中間的整塊利用

\(lazy\)和 \(f\)陣列以及字首和的所有值相加得到結果。

個人理解:

其實感覺分塊和線段樹很想嘛!只不過分塊是兩層,線段樹是一棵樹而已,而想\(f\)與 \(lazy\) 在

線段樹里都有用到。其實感覺線段樹就是在二分的基礎上理解分塊,所以我覺得如果分塊真

正懂了,線段樹也很簡單。

**實現:

#include#includeusing namespace std;

long long n,m,k,x,y,z,tot,pus,fs;

long long q[500039],ans,a[500039],f[1039],lazy[1039];

char s;

inline void read(register long long &x)

while(s>='0'&&s<='9')x=(x<<3)+(x<<1)+(s^48),s=getchar();

x*=fs;

}//快讀

inline void print(register long long x) //快輸

inline void dandianxiugai()//單點修改

inline void qujianxiugai()

for(j=x;j<=pus*k;j++) a[j]+=z,lazy[pus]+=z;

for(j=(tot-1)*k+1;j<=y;j++) a[j]+=z,lazy[tot]+=z;

for(j=pus+1;j}//區間修改

inline void dandianchaxun()//單點查詢

inline void qujianchaxun()

for(j=x;j<=pus*k;j++) ans+=a[j]+f[pus];

for(j=(tot-1)*k+1;j<=y;j++) ans+=a[j]+f[tot];

for(j=pus+1;j}//區間查詢

int main()

else }

return 0;

}

分塊 學習筆記

當我們對於乙個很大陣列 1e5 進行區間修改和區間查詢時,我們會想到線段樹的 nlog n 的優秀效率。分塊 優雅的暴力!我們將區間分成每個大小為 s 的小塊,這樣我們的複雜度就會從 n 降到 frac n s 的效率。我們先將陣列分成長度為 s 小塊,用原下標除以 s 向上取整,就是他分塊後的小塊...

分塊學習筆記

在我不知道分塊以前,我一直以為分塊是乙個非常牛逼的東西。在我多次學習並且處於懵逼狀態的時候,我一直以為這輩子我不會分塊了。直到一天我學會了他。ps 乙個小建議,學習新知識要在上午哦 下面我就把剛剛學會的分塊做了一下總結。主要思想 分塊是乙個很暴力的演算法,跟普通的列舉暴力差不了多少。對於乙個長度為n...

分塊 學習筆記

前言 內容參考自感謝。分塊,是一種優雅的暴力,它通過對數列分段,完成對數列一些區間操作和區間查詢的操作,是一種根號演算法。本文屬於分塊入門筆記,旨在零基礎的同學學會分塊。1 建塊 在建塊伊始,我們需要完成一下幾個任務 1.確定塊的大小 2.確定塊的數量 3.標記每個塊的左右邊界 4.標記每個元素所屬...