有关莫队

莫涛(队长)神犇发明的算法%%% %%%

一种优秀的暴力

用于对区间操作

基本思路是有策略的通过移动区间左右端点来改变区间,使之从一个询问的区间变成另一个区间

即通过[l,r]求得[l,r+1],[l,r-1],[l-1,r],[l+1,r]之列;

既然莫队的思路是移动端点,自然地,我们希望移动尽量少

于是,怎样少呢?

我们先考虑,把询问按l端点排序,这样左端点最多移动n次(由于排序后的单调性),但右端点可能有n*n次移动(你又管不着她);

这样的话,我们(好吧,其实是莫队)考虑折中一下:

把整个数列分成√n块,记录每个询问区间的l在哪块上,然后按l的块编号右端点双关键字排序(块编号优先);

这样有什么效率呢?

我的理解是:

对于所有r,她们的排列满足周期单调性(l属于同一块时,r单调增),

所以,l属于同一块的r之间最多移动n次(当然实际上也不会这么多),

那么r最多一共移动n√n次;

对于l,她的最多移动次数显然比扫一遍数列(这是n次)

那么考虑这个是谁贡献的呢?

是所有互为逆序对的li,li+1贡献的,

精确的,当效率最差时,每个相邻的逆序对(li,lj)对效率的负供应为2*(li-lj),

意为从li移动到lj再移回来

有趣的是:

(li-lj)li,lj互为逆序对不超过√n

然后一共也不过m个逆序对

这样,l的移动最差是m√n级的;

于是对于标算往往是nlogn甚至是nlog²n的题目,莫队n√n+m√n的最差效率也是优秀的(感觉常数大点??);

优秀的其实是代码量吧

当然,莫队适用的主要是可以由[l,r]快速求得[l,r+1],[l,r-1],[l-1,r],[l+1,r]的题目;

当然,莫队往往不支持修改,(带修莫队?你常数写大点,她和n²暴力有什么区别)主要是我也不会

这就是莫队啦

原文地址:https://www.cnblogs.com/nietzsche-oier/p/6523101.html