分块大暴力!!!分块大暴力!!!
分块是一个具有很强普适性的数据结构。可以适用于许多区间操作,只是效率略低了一点。。。
分块大体的套路如下:预处理出整块的贡献,暴力搞边界两个非完整块的贡献。
分块由鬼畜证明每个块的大小为sqrt(n)的话复杂度比较好。
一下为分块板子
解释一下几个数组的意思
block是每个块的大小,l[i]为该块的左端点,r[i]为该块的右端点,pos[i]为i属于的块
void pre() { for(int i=1;i<=cnt;i++) l[i]=(i-1)*block,r[i]=i*block; r[cnt]=n; for(int i=1;i<=n;i++) pos[i]=(i-1)/block+1; } int main() {
。。。。。 block=(int)sqrt(n); if(!(n%block)) cnt=n/block; else cnt=n/block+1; pre();
。。。。。 }
训练题目:
HNOI2016 最小公倍数
HNOI2010 弹飞绵羊
bzoj 数颜色2