莫队算法小结

唔,想有更加舒爽的阅读体验请移步http://mlz000.logdown.com/posts/252433-mo-algorithm-summary

首先众所周知的是莫队算法是要把询问先按左端点属于的块排序,再按右端点排序

复杂度就先不证了,有兴趣的同学可以自己YY下或者查阅资料

下面举几个例子详细说明

1.小Z的袜子


Description:

给定一个序列m询问

每次询问:

区间中选两个数,两个数相等的概率

若概率为则输出0/1

仔细观察发现,令x表示x个值出现的次数,则每次询问[l,r]区间时答案就是

假如我们知道[l,r]区间中每个x出现的次数,用表示,用ans表示当前答案

那么我们可以考虑当我们从[l,r]为[l,r+1]时对ans的影响

已知只有这个值的变化影响着我们的答案,而且容易看出答案是

想一想为什么

其他情况同理请自行思考

这样每次转移均是,总复杂度

Code

2.Codeforces 86D(Yandex.Algorithm 2011)


几乎和小Z的袜子一模一样的莫队模板题

Code

3.bzoj 3289(Mato的文件管理)


Description

给定一个序列m个询问

每次询问:

区间中逆序对数

很显然的发现可以用树状数组+莫队艹过去,每次修改是的,可以通过

Code

这些题基本上都是一个套路了,学了莫队基本就会了

因为每次查询都是一个连续的区间,我们可以轻易找到每移动一次后对答案的贡献

那么,如果不是正常的对序列的区间询问,而是对树上两点路径的询问该怎么办呢?

没错,这就是传说中的。。。

树上莫队

先举个例子

1.Spoj 10707 Count on a tree II(COT2)


Description

给定一棵树上n个结点上的数值,m个询问

每次询问:

区间中不同值的个数

卧槽,这TM怎么做啊?区间不是连续的啊!这莫队是不是做不了啊?

莫慌,我们有个神奇的东西,叫做

dfs序

我们可以用时间戳来对每个节点进行标记,l[u],r[u]分别表示u的进出时间

我们利用了dfs序的性质,可以把两点间路径转换为一个连续的区间(还需要考虑Lca的问题,想一想,为什么)

没错,这样我们便可以对dfs序进行分块,莫队一样搞!

神犇们看到现在的话应该会做了,蒟蒻还是继续详细的说做法把>_<

定义路径上的顶点集合,root表示根节点

定义,我们先不管lca的事情

如果我们从的路径变成的路径的话对答案有什么影响呢?

根据定义我们可以得到

于是我们可以得到

即每次更新时即可

也即对v-v‘的路径(除了lca(v,v‘))的点的存在性取反即可

实际上我们记录的是T,然后每次改变lca(v,v‘)的存在性将其变为S统计答案

然后再将lca(v,v‘)的存在性还原变回T就行了

其实读者可以换个图把dfs序标一下帮助理解>_<

然后这题实际已经解决了,将dfs序分块就将区间化为dfs序上区间问题,考虑lca就可以了

Code

2.WC 2013 糖果公园(Uoj 58)


Description

唔。。题目太长了童鞋们自己看吧>_<戳这里

总之它是需要修改的啦~

好了,想必看到这里,大家对莫队算法和树上莫队算法都已经有了一定的了解

我们发现之前我们做的题都是只有查询没有修改,那么有修改的就不可以做了吗?

并非如此

如果没有修改我们随意搞搞就可以了,有修改的话相等于加了一个时间的维度变成了三维的

我们可以按左端点为第一关键字,右端点为第二关键字,时间为第三关键字排序

预处理每次修改前的颜色,以及这次修改后的颜色

莫队对询问排序

每次询问发现与上次时间不同时暴力t++,t--同时修改颜色及答案即可(用到之前预处理)

然后解决完时间问题后便就是正常的二维莫队了

如果我们将块的大小设为,分为

相当于询问分成了块,每次移动距离为B,每块最多移动n

由于n和q同阶,所以总复杂度是,所以得到最优

然后就是拍代码啦~

Code

完结撒花!

(妈蛋从10点多写到现在总算是写完了,感人肺腑,意识不清可能哪里写错了,多多包涵>_<

时间: 2024-08-08 05:51:52

莫队算法小结的相关文章

# 莫队算法小结(待更新)

目录 莫队算法小结(待更新) 简单介绍 基础莫队 带修莫队 树上莫队 莫队算法小结(待更新) 简单介绍 博客安利: OI Wiki 大米饼 解决一类离线区间查询问题,分块思想,时间复杂度\(O(n\sqrt n)\) 排序 读入的时候对整个数组进行分块,块大小一般使用\(\sqrt n\),对询问操作排序的时候,先以块号为第一关键字,\(r\)为第二关键字,从小到大排序,然后逐个遍历 离线后将询问排序,顺序处理每个询问,暴力从上一个区间的答案转移到下一个区间的答案(通过两个指针的\(++\)和\

莫队算法小结(Markdown版)

wtf,最近挖坑有点小多啊,没办法>_<容我先把糖果公园A了再来写这个吧= =看看今天能不能A掉 好吧,我承认我第二天才把糖果公园A掉>_<下面把这篇小结补上 首先众所周知的是莫队算法是要把询问先按左端点属于的块排序,再按右端点排序 复杂度就先不证了,有兴趣的同学可以自己YY下或者查阅资料 下面举几个例子详细说明 1.小Z的袜子 Description: 给定一个序列m个询问 每次询问: 区间中选两个数,两个数相等的概率 若概率为0则输出01 仔细观察发现,令x表示x这个值出现的次

莫队算法小结以及模板题

被splay折磨了一个星期还是抄模板都wa,调试的时候查数据都发现数据太大不能查的蒟蒻杨澜决定学习莫队算法, 但是 万万没想到 莫队也到处都是坑 ----------------------------------------------题记 莫队这个东西就是一个非常简♂单的类似动规的东西,也是那种不会就一直不会,一看题解秒懂的题,[虽然我看题解也半天看不懂但是只是第一道题,万事开头难嘛(也许吧)] 莫队算法是一种基于分块的离线算法,主要用来解决一些区间的询问[就是暴力],我们需要做的就是把询问

莫队算法

Beautiful Girl 题意 给定一个长度为 n 的序列 a[1], a[2], ..., a[n] . m 组询问 (l, r, K) , 求区间 [l, r] 去除重复的数之后的第 K 小. n, m <= 100000 . 分析 莫队算法 + 值域分块. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cctype> 5 #include &

BZOJ4241 历史研究 莫队算法 堆

欢迎访问~原文出处--博客园-zhouzhendong&AK 去博客园看该题解 题目 Description IOI国历史研究的第一人--JOI教授,最近获得了一份被认为是古代IOI国的住民写下的日记.JOI教授为了通过这份日记来研究古代IOI国的生活,开始着手调查日记中记载的事件. 日记中记录了连续N天发生的时间,大约每天发生一件. 事件有种类之分.第i天(1<=i<=N)发生的事件的种类用一个整数Xi表示,Xi越大,事件的规模就越大. JOI教授决定用如下的方法分析这些日记: 1.

CodeForces - 86D 莫队算法

http://codeforces.com/problemset/problem/86/D 莫队算法就是调整查询的顺序,然后暴力求解. 每回可以通过现有区间解ans(l,r)得到区间(l+1,r),(l-1,r),(l,r+1),(l,r-1)的区间解. 调整方式http://blog.csdn.net/bossup/article/details/39236275 这题比那个还要简单,查询的是K^2*Z,很清楚就是莫队算法,然而做的时候没有学过,回来补题补到 关键是我一直没明白为什么重载小于号

codeforces 617 E. XOR and Favorite Number(莫队算法)

题目链接:http://codeforces.com/problemset/problem/617/E 题目: 给你a1 a2 a3 ··· an 个数,m次询问:在[L, R] 里面又多少中 [l, r] 使得 al xor al+1 xor ··· ar 为 k. 题解: 本题只有区间查询没有区间修改,而且数据量不大(10w),所以可以用离线的方法解决. 使用莫队算法来解决,就需要O(1)的修改[L, R+1] .[L, R-1].[L+1, R].[L-1, R]. 详细的莫队可以百度学一

(普通的)莫队算法简单介绍

莫队算法(由莫涛发明的)是一种离线的暴力算法(至少我这么认为).使用莫队算法的条件是,知道一个区间[l, r]的结果,那么也可以快速知道[l + 1, r],[l - 1, r], [l, r - 1], [l, r + 1]这四个区间的结果.于是可以想到,直接通过这样转移来解决一些问题.当然有些出题人机智,故意卡这种暴力,让你从头跑到尾然后从尾跑到头,于是时间复杂度高达O(n2) 而莫队算法就是通过改变处理询问的顺序来降低时间复杂度. 比如说现在知道一个区间[l1, r1],又要转移到[l2,

莫队算法良心讲解

问题:有n个数组成一个序列,有m个形如询问L, R的询问,每次询问需要回答区间内至少出现2次的数有哪些. 朴素的解法需要读取O(nm)次数.如果使用STL的Map来保存出现的次数,每次需要O(nmlogn)的复杂度.有没有更快的方法呢? 注意到询问并没有强制在线,因此我们可以使用离线方法.注意到一点,如果我们有计算完[L, R]的map,那么[L - 1, R].[L + 1, R].[L, R - 1].[L, R + 1]都能够在O(logn)的复杂度得出.是否能安排适当的询问顺序,使得每次