莫队算法

网上百度了一发,这个算法是一个叫莫涛的大牛研究出来的 Orz~   看了一些牛牛们的博客,也大概理解了这个算法。

 

先说这个算法的作用吧:

 

莫队算法能够在O(n^1.5)的复杂度内求出区间[L,R]中某一个数字出现的次数。但是操作是离线的,因为这个算法的就是根据这个性质来的。

如果我们已经知道了区间[L,R]的数字的出现次数,就能够在O(1)的时间内得到[L,R+1],[L,R-1],[L+1,R],[L-1,R]因为只需要判断相邻的那个数字即可。

现在我们有长度为n的数组,将它分成sqrt(n)部分,对m次查询排序,根据左边界所在的块排序,然后再根据右边界排序。

如果i 与 i + 1两个查询在同一个块内,那么我们只需要让r增加,由于块内长度为sqrt(n) 所以复杂度O(n^1.5);

如果i 与 i + 1正好跨越一块,那么r最多变化sqrt(n),所以复杂度还是O(n^1.5);

所以总复杂度为O(n^1.5);

posted @ 2016-07-14 20:15  sweat123  阅读(469)  评论(0编辑  收藏  举报