Sqrt Note

Ntokisq 的 [DS] sqrt technology 题单的学习笔记。

对 $a$ 转化成 $b$ 下标,变为求区间最长连续上升子序列。

直接 dp $O(qn)$,回滚莫队 $O(n\sqrt q)$。

强制在线,考虑分块。整块之间答案预处理。散块对整块,对块 $j$ 预处理出 $[s_{j},i]$ 和 $[i,t_{j}]$ 的答案,散块每个扫一遍。散块对散块,先算左右散块各自的,再算左散块对右散块的。利用右散块每个数的答案贡献到初始值的位置,扫左散块同时更新。

$B=\sqrt{n}$,时间 $O(n\sqrt{n}+q\sqrt{n})$,空间 $O(n\sqrt{n})$。

这个是大众题目,预处理出整块间的答案。把同一个值的所有下标塞进一个 vector,暴力扫左右散块,若 vector 里 $pos_i\pm ans$ 的下标存在就使 $ans\gets ans+1$。

时间 $O(n\sqrt n+q\sqrt n)$,空间 $O(n)$。

考虑分块。先想查询。

对于块的内部,每个块预处理 $dis_{i,j,k}$,表示第 $i$ 个块内,$j$ 到 $k$ 的最短距离,要将 $j,k$ 在块内离散化。对于块到块,维护第 $i$ 个块值 $j$ 最早出现位置和最晚出现位置 $L_{i,j},R_{i,j}$,贪心算下答案。

整块修改。若当前块没出现 $x$,直接跳过。若当前块没出现 $y$,直接将 $x$ 对应的离散值传给 $y$。若当前 $x,y$ 均出现,暴力更新关于 $x,y$ 所有信息。每次这样修改都会使块内的颜色少一,最多修改 $O(\sqrt n)$ 次,复杂度没问题。

时间 $O(n\sqrt n+q\sqrt n)$,空间 $O(n\sqrt n)$。

启发式合并解决合并操作。复杂度瓶颈在于找邻居,根号分治即可。$siz$ 小于 $B$ 暴力扫自己的相邻点,大于 $B$ 暴力维护每种颜色的邻居。

应该是时间 $O(n\log n+q\sqrt n)$,空间 $O(n\sqrt n)$。

先序列分块。查询利用值域分块。修改就块内离散化,整块部分类似天降之物。要是 $x,y$ 都存在就暴力修改,每次减少一个颜色,总颜色是 $O(q+n)$ 的,摊下来没错。

时间 $O((n+q)(\sqrt n+\sqrt w))$,空间 $O(n\sqrt n+n\sqrt w)$。

序列分块,整块对整块可以预处理相邻块的贡献然后做二维前缀和,这部分可以归并。整块内部答案直接 $O(B\log B)$ 预处理,散块内部可以维护 $pre,suf$ 表示向前向后的答案,散块对整块可以处理值域前缀和,也可以维护 $F_{i,j}$ $1\sim j$ 与块 $i$ 之间的逆序对数。散块到散块就归并一下,提前预处理每个块排序后的数组。

同一个块内就容斥一下就好。

时间 $O(n\sqrt n+q\sqrt n)$,空间 $O(n\sqrt n)$。

posted @ 2023-05-13 11:24  Terac  阅读(15)  评论(0)    收藏  举报  来源