数据结构复习之分块

分块大暴力!!!分块大暴力!!!

分块是一个具有很强普适性的数据结构。可以适用于许多区间操作,只是效率略低了一点。。。

分块大体的套路如下:预处理出整块的贡献,暴力搞边界两个非完整块的贡献。

分块由鬼畜证明每个块的大小为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

posted @ 2017-02-28 22:44  qt666  阅读(173)  评论(0编辑  收藏  举报