莫队算法+哈希 csu1515 Sequence

这是中南第二届邀请赛的题目,当时还不懂莫队算法,,现在做起来感觉思路还是挺清晰的,可以用来当莫队算法的练习


首先讲下莫队算法(也是逆天),是一种分块的思路(超逆天思维)

它是一种离线算法,复杂度是O(m*sqrt(n)),m是区间范围大小,n是区间个数

适用条件:如果知道[l,r]的答案,可以用O(1)或者O(logn)的复杂度求出[l-1,r]  [l+1,r]  [l,r-1]  [l,r+1]的答案,那么就可以用莫队算法(几乎是区间万能算法)


大概的思路是,把n个区间分成sqrt(n)块,求出区间左端点所在的块,然后排序

先按左端点所在的块的大小排序,如果相等,再按照右端点的大小排序。如果右端点的大小相等,再按照左端点的大小排序


然后只要按照排序的顺序,依次求出每个区间的答案就可以了


莫队算法复杂度证明:

设n为区间个数,m为r最大的值

y向右移动的次数,最极端的情况下,每个块的y都会从1移动到m,一共有sqrt(n)个块,所以这的复杂度是m*sqrt(n)

y向左移动的次数,只会在跨块的时候才会出现,一共只会出现sqrt(n)-1次跨块的情况,假如每次y都是从n向左移动到了1,所以这的复杂度是m*sqrt(n)

x不跨块移动的次数,l会在1和这个区间长度的交换,记当前区间长度为w,一共sqrt(n)个块,一个块有sqrt(n)个,复杂度w*sqrt(n)*n=w*n,实际上m平均等于sqrt(m)左右,总

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值