莫队

极好的blog
https://www.cnblogs.com/WAMonster/p/10118934.html

概要

概述一下,就是区间上的双指针+分块+排序优化的优美暴力
一般情况下块长取\(\sqrt{n}\)
复杂度\(O(n \sqrt{n})\)

块长选取

我们令数列长度为\(n\),询问\(m\)个,块长\(s\),左端点位于第\(i\)块的询问数量为\(q_i\)
那么最劣时间复杂度应是

$ \sum_{i=1}^{\frac{n}{s} }q_i\cdot s+n =ms+n\cdot \frac{n}{s} $

由基本不等式可得
$s_{min}=\frac{n}{\sqrt[]{m} } $

此时算法效率最高
对于一般或者回滚莫队,还是常用 \(\sqrt{n}\)为块长
带修的莫队一般取\(n^{\frac{2}{3}}\)为块长

扩展顺序

莫队的双指针扩展顺序(下面是一种正确的且好记的写法)

                while(l>q[i].l) add(--l);
		while(r<q[i].r) add(++r);
		while(l<q[i].l) del(l++);
		while(r>q[i].r) del(r--);
posted @ 2023-02-22 19:23  Diamondan  阅读(17)  评论(0)    收藏  举报