莫队
极好的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--);

浙公网安备 33010602011771号