分块算法是一种优化暴力算法的思想。通常将原始数据划分成适当大小的块(一般为 \(\sqrt{n}\)),对每个块的数据进行预处理,以达到比暴力算法更优的时间复杂度。
划分算法确定块长后,一般需要开两个数组来存储每一块的右边界和原始数据所属的块序号,以便后续操作。代码示例如下:
int sq=sqrt(n);
for(int i=1;i<=sq;i++) ed[i]=n/sq*i;
ed[sq]=n;// 将剩下的都放到最后一个块内
for(int i=1;i<=n;i++)
for(int j=ed[i-1]+1;j<=ed[i];j++)
bl[j]=i;