分块算法 优雅的暴力
来源:互联网 发布:企业在淘宝开店流程 编辑:程序博客网 时间:2024/04/30 19:01
参考:http://blog.csdn.net/XianHaoMing/article/details/52201698
分块
先简单介绍一下分块算法。
分块算法是一种很常见的根号算法,一般它的时间复杂度会带根号。
分块和线段树的区别在于,分块算法可以维护一些线段树维护不了的东西,例如单调队列等,线段树能维护的东西必须能够进行信息合并,而分块则不需要。不过,它们也有共同点,分块和线段树一样,分块需要支持类似标记合并的东西。
简单来说,分块算法就是优化过后的暴力。
现在讲一下这种算法的实现。
这种算法会将序列(序列长度为
我们一般都会设
通常实现时,我们用
单点修改时,我们一般先将对应块的标记下传,再暴力更新被修改块的状态。
时间复杂度
如果是区间[
中间最多经过
至于询问操作,和区间修改类似,对于中间跨过的整块,直接利用块保存的信息统计答案,两端剩余部分任然可以暴力扫描统计。
时间复杂度和区间修改一样,也是
如果询问次数为
1.思想
如果我们需要对一个特定的序列进行操作,那么非常直观、简单的方法就是纯暴力(不,那叫模拟)。
不过如果暴力能过的话,那就呵呵了。
所以我们要想一些比较高能的数据结构——分块。
相比线段树来说,分块算法比较难实现,但是只要深入理解,就可以实现了,只不过需要一些数据结构的辅助。
分块实质来说就是把一个序列切分,从而实现对查询、查找、替换等等操作的高效处理。
模板
int n; scanf("%d",&n); int block=sqrt(n); int cnt=0; if(n%block) cnt=n/block+1; else cnt=n/block; for(int i=1;i<=n;i++) scanf("%d",&k[i]); for(int i=1;i<=cnt;i++) { l[i]=(i-1)*block+1,r[i]=i*block; } r[cnt]=n; for(int i=1;i<=n;i++) belong[i]=(i-1)/block+1;
- 分块算法 优雅的暴力
- 分块(有理有据的暴力)
- 莫队算法 优雅的暴力 (Codeforences # 340 E div2)
- 【搜索】优雅的暴力合集
- 实现分块查找的算法
- 实现分块查找的算法
- BZOJ 2038 小Z的袜子(hose)(分块暴力)
- 高级的暴力(一)——分块
- BZOJ 3343 教主的魔法 暴力分块做法
- BZOJ 3343: 教主的魔法 分块大暴力
- 【算法题】优雅的点
- 暴力的算法
- hdu 4552 怪盗基德的挑战书【KMP+dp || 优雅暴力】
- 分块算法
- 分块算法
- CF 813E 分块暴力
- Codeforces 617E XOR and Favorite Number (区间异或和 莫队算法 分块暴力)
- 矩阵分块相乘的Strassen算法
- “集体智慧编程”之第六章:文档过滤的基础和朴素贝叶斯分类器
- awk命令
- 为WinEdt自定义XeLatex快捷键
- 我来说说XML文件中的xmlns、xmlns:xsi和xsi:schemaLocation、dtd文件的具体含义
- 【Android学习】spinner
- 分块算法 优雅的暴力
- 常用数据库知识(四)
- 解决cordova 自打包下https下 调不通的问题
- 数据库第三章 学生——课程数据库
- libsvm中数据归一化的重要性
- 基于ros系统下使用Android应用 Make nav进行地图加载和导航
- anroid studio 快捷键 全解
- Keras 和 tensorflow安装过程中的小问题
- Nginx的基本原理