【算法学习】分块九讲
前言
我太想学了,但我没空,下次一定。 ——24.9.24
24.10.28 我回来了,考完csp肯定要学一下的啊!!!
发现大佬写的比我详细太多了,悲 链接。
数列分块入门 1
非常简单的分块操作,分块就是将序列分为若干个等长的区间,对每个块维护一些信息,这个就是个模板题甚至还是单点和,再见。
数列分块入门 2
肯定想到排序块内元素二分查找,对于散块暴力处理查询,对于整块直接懒标记,查询时判断即可,注意写 while 要注意边界问题。
代码我就不贴!!
数列分块入门 3
和上一题一样,对于整块,二分找到大于等于当前数的前一个数,对于散块,直接暴力!!!
数列分块入门 4
真正的分块板子题,区间加区间查,非常标准。
数列分块入门 5
和某某线段树题相同,如果区间最大值是小于 \(1\) 的话没有修改必要,暴力修改散块时也跳过小于 \(1\) 的数,剩下的该怎么维护怎么维护。
数列分块入门 6
终于来了一个有创新的题了,确实可以可以想到用一个 vector 插入查询,但是这样和分块就没啥关系了,而且一直插入前面造成的复杂度很大的,所以考虑分块 vector 存,这样均摊降低复杂度。如果先在一个块有大量单点插入,这个块的大小会大大超过 \(\sqrt{n}\),那块内的暴力就没有复杂度保证了,所以可以每 \(\sqrt{n}\) 次修改就重构分块保证了每个块的大小相对均衡。
当然这题数据随机,不用重构也行。
数列分块入门 7
简单线段树题啊!!不是,其实分块也是一样的维护两个懒标记,没什么意思,直接复制线段树跳了跳了。
数列分块入门 8
遇到了高难度的分块题了,不是很水了,首先大概率会出现大区间,对区间直接懒标记上整个区间都只是同一个数 \(x\),如果 \(tag\) 和 \(x\) 相同那直接加 \(len\) 就可以了,对散块暴力修改查询,这样均摊毫无问题。
数列分块入门 9
不强制在线,可以莫队,也可以分块,预处理 \(s_{i,j}\) 为前 \(i\) 个块 \(j\) 这个数出现次数,\(p_{i,j}\) 第 \(i-j\) 之间众数是什么。
分块思想散块暴力处理,整块预处理出来,然后散块中数的出现次数比较整块的众数即可。
时间复杂度 \(O(n\sqrt(n))\)