【原创】【回滚莫队】

###莫队算法:
常规的莫队算法,是将询问操作离线完成,根据左端点所在的块为第一优先,以右端点下标为第二优先进行排序,每两个相邻的询问都根据上一次询问的答案,通过重复“插入一个值/删除一个值”的操作,来得到下一个询问的答案。
但是,常规的莫队算法弊端有很多,比如需要同时支持快速插入/删除一个值,本文主要介绍一种莫队算法的修改版,以解决一些只能支持插入,不能支持直接删除,但支持撤回操作的问题(关于撤回操作的定义见下文)。

##改良莫队(回滚):
其实算法的思想很简单,大体上和普通的莫队并无太大区别。
排序方式是一样的。
但是对于左端点所在的块,将询问分为不同的类分别处理。也就是说,我们一次只处理左端点在同一个块中的所有询问。

对于一类询问,有以下特点:其右端点呈不下降序列,左端点则位于同一个大小为 N \sqrt N N 的块内
那么我们可以将这些询问分为两部分:

这里写代码片
对于右半部分,我们递增地插入元素,对于左半部分,每次询问后不保留,都是从拆分点向左依次加入。我们可以先向右扩大右端点,再向左扩大左端点,这样一来,所有不保留的操作都是依次进行的,之后再依次撤回即可。当前类处理完后,全部信息清空。最后的复杂度仍然是 O ( N N ) O(N\sqrt N) O(NN ),证明很直观也很简单,读者有兴趣可以自己思考。
读到这里,你可能对这种算法的实用性感到质疑:撤回操作和删除操作有什么区别吗?其实区别很大!
直接来看一个例题

###例题
题号:CQBZOJ3611: 作业斯的监视
给出N个点,M条边的无向图,每条边有一个编号id
有Q次询问,每次询问给出两个值l,r,求仅保留编号id∈[l,r]的边时,图中的联通块个数,以及每个联通块大小的异或和。

样例输入:
4 6 3
1 2
2 3
3 4
1 3
2 4
1 4
1 3
2 5
3 4

样例输出:
1 4
1 4
2 2

用线段树分治等一系列算法都可以解决第一问,然而用本算法,就可以在 O ( N N l o g N ) O(N\sqrt NlogN) O(NN

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值