上节说了下莫队的来源 接下来口胡(wu)它的基本思想 # 举一个弱智的栗子 我们来询问一下5 4 2 3 1的离线【L , R】区间和 哦当然前缀和O(1)秒杀我们暂时忽略这点 # 给出以下询问 1 2 4 5 3 5 我们假装已经得到【1,2】的区间和S(记下来),我们想要充分利用这个S去得到下一个答案,考虑他们之间的转移,我们把a[3],a[4],a[5]加到S中去,这样就得到了【1,5】的答案S,好的记下来 # 接着我们把a[1],a[2],a[3]从S中减掉,这样就得到了【4,5】的答案S,好的记下来,完成转移挖好声器 同样的把a[3]加到S中得到【3,5】的答案S好的记下来。 这样最后把答案输出即可 # 下面我们数一数进行了多少次加减法,即进行了多少次运算 7次 这道题是离线的所以我们把询问安排下处理顺序 得到【1,2】后先处理【3,5】后【4,5】 这样运算是6次(应该没数错吧…) 莫队就是靠这样暴力的转移再加一些玄学的对询问排序来达到可以A题的效果 把以上的过程推广到区间离线问题中 (下面用【a,b】代替区间a,b的答案) 如果我们可以在很短时间内从【L,R】得到【L,R+1】【L,R-1】【L+1,R】【L-1,R】 那么从【L1,R1】到【L2,R2】的转移的复杂度就是|L2 - L1| + |R2 - R1| 最后把所有询问处理一遍就可以的到所有答案,复杂度自然就是相邻处理问题之间的|L2 - L1| + |R2 - R1|加起来 复杂度? 不加对问题排序的暴力转移会T成翔 于此,有两种解决办法 圈1:把询问看成二维平面上的点,最小复杂度就是曼哈顿距离最小生成树的树边和(代码量较大但较快) 圈2:神奇的分块排序,将复杂度优化到均摊O(n*sqrt(n)) End。