莫涛(队长)神犇发明的算法%%% %%%
一种优秀的暴力
用于对区间操作
基本思路是有策略的通过移动区间左右端点来改变区间,使之从一个询问的区间变成另一个区间
即通过[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²暴力有什么区别)主要是我也不会
这就是莫队啦