这两天学习了一下莫队
做了三道题
【国家集训队2010】小Z的袜子
洛谷2709 小B的询问
【国家集训队2011】数颜色
前两道就是普通的莫队
最后一题是带修改的莫队
两个东西大同小异,因此先就写普通莫队。
首先一定要明确莫队的适用范围,
求解多次询问区间的问题
如果已知(l..r)的答案,
能够在O(1)(或者很小的时间复杂度???)推出(l-1..r)(l+1..r)(l..r-1)(l..r+1)的时候
适用莫队
莫队高效的原因在于
并不是反复计算某一个区间
因为区间存在重合的部分
因此重合的部分不用反复计算,
莫队的核心就是重复利用这些重合了的部分来提高效率。
别人的博客告诉我们,如果要达到最高效率,
此时的顺序应该按照曼哈顿距离的最小生成树
但是这个玩意貌似很难弄,然后几乎所有人都是用的分块
大致的步骤如下:
1.读入所有询问,离线解决
2.按照左端点将询问分块
3.以分块为第一关键字,右端点为第二关键字排序
4.按照排序的顺序依次解决所有的询问
这样子做,虽然不是按照曼哈顿距离的最小生成树来计算
但是效率相比与直接计算区间高了很多。
此时还是利用了大量的重复信息,提升了效率。
以上是关于普通莫队的做法
接下来如何解决带修改的莫队
带修改的莫队做法和普通莫队并没有什么不同
只是每一个询问还要储存上一次修改操作的编号
一样的离线,排序
每一次操作之前首先对队列进行修改和还原,
然后其余的操作和普通的莫队就一模一样了。