回滚莫队
用来处理一类区间扩张容易而收缩难的莫队问题。
大概的思路如下:
还是按莫队的方法排序(不要奇偶性优化),把所有询问按照左端点所在块分类处理。
对于左端点在同一个块([L,R])的,先把右端点也在([L,R])内的暴力处理。
而其它询问的右端点必定递增,因此我们可以实时处理出([R,r])的区间信息,每次把左端点从(R)移到(l)。
可以发现这样做我们的复杂度还是(O(nsqrt n))的,并且只需要支持区间扩张了。
莫队二次离线
(m)个询问,每次询问(sumlimits_{i=l}^rsumlimits_{j=l}^rval(l,r))。
设(f(p,l,r)=sumlimits_{i=l}^rval(p,i))。
考虑莫队的过程,假如我们现在要把区间从([l,r])移到([l,r+k])。
那么我们会多出来(sumlimits_{i=1}^kf(r+i,l,r+i))的贡献。
利用差分将其转化为(sumlimits_{i=1}^kf(r+i,1,r+i)-f(r+i,1,l-1))。
前面的最多只有(O(n))种。
对于后面的,我们考虑把所有形如(forall pin[l,r],f(p,1,i))这样的询问的([l,r])挂在([1,i])的右端点(i)上。
总共会挂(O(n))个长度总和为(O(nsqrt n))的区间。
考虑扫描线,从左往右计算,记录一些([1,i])的信息,然后把挂在(i)的询问拿出来,(O(1))地计算各个(f(x,1,i))。相当于(O(n))次插入和(O(nsqrt n))次询问。
有的时候也可以(O(sqrt n))地计算(sumlimits_{x=l}^rf(x,1,i))。