Part # 0. 前言 \text{Part \# 0. 前言} Part # 0. 前言
这个蒟蒻刚学带修莫队,所以 介绍带修莫队的部分比较简略,大家可以去参考一下 OI-wiki 或者其他大佬的博客:)
本文参考了洛谷题解。
Part # 1. 带修莫队 \text{Part \# 1. 带修莫队} Part # 1. 带修莫队
带修莫队,顾名思义,就是待修改的莫队。
众所周知,普通莫队可以在比较好的时间复杂度内完成一次查询操作,但是不支持修改操作,于是就有了带修莫队。
我们知道,莫队实际上是从[l,r]到[l+1,r]、[l-1,r]、[l,r+1]、[l,r-1]的转移,而且都是 O ( 1 ) O(1) O(1)的,所以如果我们把中括号改成小括号,那么就是莫队的本质了:
(l,r)->(l-1,r)(l+1,r)(l,r-1)(l,r+1)

图中四个箭头的移动都是可以 O ( 1 ) O(1) O(1)完成的,那么两点之间的曼哈顿距离就是从一个状态到另一个状态所需要的最小挪动
(不了解曼哈顿距离的同学戳上面加粗字体)
那么对于所有的查询,最快的办法就是在坐标系上找到曼哈顿最小生成树
(其实没有必要会这个因为太麻烦了)
你也许会说:“我不会啊!”
这完全没有关系,因为
我也不会
但是我们并没有必要得到最佳答案,能卡过去就够了。
于是我们采用分块的想法,将其分成(n/sz)个长度为sz的块,在每一个块中按照右端点从小到大来移动
就像这样:

至少这样不会被卡掉……
至于块的大小? n \sqrt n n呗。
(实际上严谨的说,应该是 n m \dfrac {n}{\sqrt {m}} mn,具体为啥有兴趣的同学可以研究一下,一般来说块的大小 n \sqrt n n<

最低0.47元/天 解锁文章
318

被折叠的 条评论
为什么被折叠?



