大佬博客
无删除莫队:
没打过但是可以拿来凑数。
不就是用可回退化(你一定需要看一看[十二省联考2019]希望)的莫队来。。。。
skip。
二次离线莫队:
一开始看是ynoi的题以为没有啥可拓展性。
然后看了上面那位大佬的博客才发现这个方法大有可为。
莫队实际上是把
O
(
m
)
O(m)
O(m)个询问拆分成
O
(
n
m
)
O(n\sqrt m)
O(nm)个询问的离线算法。
那么每个(标准的)莫队可以分成3个部分:
1.移动一步后根据自己维护的数据结构等计算增加的答案。
O
(
n
m
)
O(n\sqrt m)
O(nm)次,单次查询
O
(
a
)
O(a)
O(a)
2.移动一步后维护自己的数据结构。
O
(
n
m
)
O(n\sqrt m)
O(nm)次,单次维护
O
(
b
)
O(b)
O(b)
3.移动到目标区间后利用自己的数据结构计算答案。
O
(
m
)
O(m)
O(m)次,单次询问
O
(
c
)
O(c)
O(c)
我们可以发现3的 O ( m ) O(m) O(m)次数特征进行优化,用一些插入复杂度低使得询问复杂度高的数据结构如值域分块。当然这不是我们需要的东西。
如果(正如此题),我们把增加的答案分为两个前缀对新增的点x的贡献的答案之差。
那么我们只需要算前缀的贡献。
那么我们只需要知道前缀的数据结构是什么样子。
即1~n一路插入过来。复杂度
O
(
n
b
)
O(nb)
O(nb)
在插到每一个前缀时,对于莫队中会需要用到这个前缀给他贡献的每个点x,求贡献。
O
(
n
a
n
)
O(na\sqrt n)
O(nan)
那么复杂度就是
O
(
n
b
+
n
a
n
+
n
n
+
m
c
)
O(nb + na\sqrt n + n\sqrt n + mc)
O(nb+nan+nn+mc)
然后平衡一下选择一个
a
a
a小使得
b
b
b大的数据结构比如说数组即可得到一个优秀的复杂度。
前提是可以把贡献拆分。