【算法学习】分块九讲

前言

LibreOJ 分块九讲

我太想学了,但我没空,下次一定。 ——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))\)

image

posted @ 2024-10-28 08:37  sad_lin  阅读(5)  评论(0编辑  收藏  举报