分块、莫队及一些根号方法 总结

第二分块没改出来给我干破防了。提交记录:五彩斑斓的世界()。

分块、莫队、根号分治的核心

平衡

  • 平衡整块和散块的[时间](?)复杂度。(分块)
  • 平衡修改和查询的[时间](?)复杂度。(分块)
    • 如 单点加,区间求和:
      分块维护原序列(直接做):\(O(1)\) 修改,\(O(\sqrt n)\) 查询。
      分块维护前缀和(整块维护整个序列的前缀和,散块维护块内的前缀和):\(O(\sqrt n)\) 修改,\(O(1)\) 查询。
  • 平衡预处理和[操作](?)的[时间](?)复杂度。(在线莫队)
  • 平衡两种情况的[时间](?)复杂度。(根号分治)

目前想到了这些。

分块的基本思想是,通过对原数据的适当划分,并在划分后的每一个块上预处理部分信息,从而较一般的暴力算法取得更优的时间复杂度。分块的时间复杂度主要取决于分块的块长,一般可以通过均值不等式求出某个问题下的最优块长,以及相应的时间复杂度。—— August 22, 2024 cyf 老师的 ppt

分块的种类

  • 序列分块:本质是在下标轴(\(i\))上分块。
  • 值域分块:本质是在值的轴(\(a_i\))上分块。
  • 操作分块:本质是在时间轴(一般是输入顺序)上分块。

上面这三种分块应该是可以套的。

  • 块状数组。
  • 块状链表。

分块和 log 数据结构的比较

此处“log 数据结构”指的是线段树、Splay 或 FHQ-Treap。块状数组对应线段树、块状链表对应 Splay 或 FHQ-Treap。

块状数组和块状链表的理论时间复杂度是高于线段树和平衡树的。但是块状数组常数应该较小,甚至可能有时跑得比线段树快,而且块状数组比较好写。块状链表常数大不大、好不好写我不知道。

块状数组也可以像线段树一样打 tag。

更重要的是,块状数组比线段树更暴力,因为它不一定需要下传标记(实现标记永久化较方便),也不一定需要合并结点来得到块的信息(即使需要合并块来得到答案)(因此可以暴力重构每一块)(因此可以对每一块处理出线段树没法维护的信息,如:LOJ 6278、LOJ 6279)。块状数组还可以预处理出每两块间的区间的信息,从而实现在线莫队(可以一步步移动区间端点)。

小结:块状链表包含了[一般](?)线段树的功能,还能实现更多的东西,因为它更暴力。

块状数组和块状链表的比较

块状数组较固定,[不支持插入](?)。块状链表较动态,支持插入[等](?)操作(如:LOJ 6282)。

为什么要给链表分块?我觉得是为了快速地跳。

块状链表的实现:

块状链表,若一个块长度大于阈值2倍,分成2个块,若一个块长度小于阈值1/2,与旁边块合并。—— 同一个 ppt

一些分块相关的技巧

这一部分是照着 August 22, 2024 cyf 老师的 ppt 里面的题和题解写的。

  • 观察到一个数经过很少的操作就变成一个不变的值,而且没有其他修改操作或者其他修改操作不会反向影响这个过程,所以维护块内是不是全都是不变的值。散块暴力做,整块判断一下还能再变再暴力做。每个块经过很少的操作就会变成不变的,所以复杂度是对的。线段树也可做。如:LOJ 6281、[花神游历各国](???(是不是这个名字我搞忘了))。
  • 珂朵莉树。其实是用了珂朵莉树的思想,如果修改有区间推平操作,可以考虑对每个块记它是否纯色。每次区间推平会把一些(可能没有)中间的杂色块变成纯色,可能把两边的纯色快变成杂色。那么每次区间推平最多增加两个杂色块。所以如果其他修改操作没什么对杂色块个数的大的影响的话,杂色块的总个数是线性的。又有每个块的大小是根号,所以可以对每个杂色快暴力处理答案。如:LOJ 6284。
  • 对于不好直接合并块来得到答案的,考虑可能的答案有多少个,如果只有根号个,可以弄出可能的答案,再一一判断。如:LOJ 6285(区间最小众数)。
  • (与分块本身无关)对每个数值维护它出现的位置,可以方便地判断它在给定区间里出现了多少次。[如:LOJ 6285(区间最小众数)。](?)
  • (在线莫队)处理出块块之间的区间的信息,查询时直接跳左右端点。[如:LOJ 6285。](????)
  • (在线莫队)如果信息有可减性(或者类似的,总之就是可以运算上一个逆),就可以算块间的前缀和(或者类似的前缀什么),而不需要处理出每两个块之间的信息。如:P4119。
  • (与分块本身无关)某一固定范围内数值为 \(x\) 的全部变成数值 \(y\),可以用并查集维护。注意此处并查集的复杂度,P4117 中并查集的复杂度是 \(O(1)\) 合并,[均摊 \(O(1)\)](??) Find 的,因为一个数值变成另一个之后它就没有了,所以合并的时候不用 Find。好像也可以用链表或?。见 lxl 第二分块的题解。如:P4119、P4117。
  • 对于第 k 小值的询问用值域分块处理。如:P4119。
  • (分块、线段树、平衡树都可用)为了合并两块的答案记录块左(前缀或者第一次出现)信息、块右(后缀或者最后一次出现)信息、[块的信息 或/和 块的答案]。如:P5397、区间最大子段和。
  • 块内数值种类数不超过大概根号个。离散化。可以处理它们两两之间的东西。如:P5397。
  • P4117 的奇妙转化,使得枚举到多少范围就减多少。减很多的可以变成加余下的,再全局减。P4117。

整理到 ppt 第 28 页(第 28 页还没整理)了。

写题去了,咕咕咕。

2024.8.24

posted @ 2024-08-24 09:50  huangkxQwQ  阅读(9)  评论(0编辑  收藏  举报