关于分块 ---全网最详细 最易懂的分块 罗列多个知识点

本文深入讲解了分块算法的核心思想及实现细节,介绍了如何通过预处理将数据分块存储,以加速区间操作的效率。文章详细阐述了块大小的选择、块内数据存储方式以及针对不同区间操作的具体算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:

分块的思想让我们对一个区间操作编的简单,这是因为,我们在一开始(读取数据的时候)就对一部分区间(块)进行了操作。

  • 肯定要有块的大小(一个块里的data个数) 建议是 sqrt(n);
  • 把块存在一个数组中,我们把第几个块成为块的下标,所以我们知道最后一个块的下标是 : n / sqrt(n); (这里要注意 块的下标一定是从0开始存的!!!为什么呢 因为我们可以快速根据 data的下标找到data所在块的下标 data下标/块的大小
  • 但是我们的data的下标可以从0 开始存也可以从1开始存,不会对我们的分块的操作有影响!!!!因为不管从 0 还是1 开始存,只会影响第一个块里的data的多少
  • 为了叙述方便
    我们把块的下标叫做块的id
  • 敲黑板了!!!
  • id为n的块对应data的区间(下标)为

[id*size , (id+1)*size -1]

关于块的操作:

我们要求 从 L 到 R 的区间 操作:

如果 L的对应块(L/size) 和R的对应块(R/size)一样那就只能暴力了,说明L 到R 在一个块中
要是不一样 我们要分三段

从 L 到 L 对应块的末尾

从 L 的下一块到 R 对应块的上一个块

从 R 对应块的开始到 R


  • 这个例子是求 从L 到 R 的区间和
  • 块的内容是对应data的下标的区间 在读取数据的时候已经搞定
int quarry(int l,int r){
    int idl=l/size;
    int idr=r/size;
    int ans=0;
    if(l==r){
        for(int a=l;a<=r;a++){
            ans+=data[a];
        }
        return ans;
    }else{
        for(int th=l;th<(idl+1)*size;th++){
            ans+=data[th];
        }
        for(int id=idl;id<idr;id++){
            ans+=kuai[id];
        }
        for(int th=idr*size;th<=r;th++){
            ans+=data[th];
        }
        return ans;
    }
}

  • 一定要自己写代码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值