有关莫队

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

一种优秀的暴力

用于对区间操作

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

即通过[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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值