莫队

回滚莫队

用来处理一类区间扩张容易而收缩难的莫队问题。

大概的思路如下:
还是按莫队的方法排序(不要奇偶性优化),把所有询问按照左端点所在块分类处理。
对于左端点在同一个块\([L,R]\)的,先把右端点也在\([L,R]\)内的暴力处理。
而其它询问的右端点必定递增,因此我们可以实时处理出\([R,r]\)的区间信息,每次把左端点从\(R\)移到\(l\)
可以发现这样做我们的复杂度还是\(O(n\sqrt n)\)的,并且只需要支持区间扩张了。

莫队二次离线

\(m\)个询问,每次询问\(\sum\limits_{i=l}^r\sum\limits_{j=l}^rval(l,r)\)

\(f(p,l,r)=\sum\limits_{i=l}^rval(p,i)\)
考虑莫队的过程,假如我们现在要把区间从\([l,r]\)移到\([l,r+k]\)
那么我们会多出来\(\sum\limits_{i=1}^kf(r+i,l,r+i)\)的贡献。
利用差分将其转化为\(\sum\limits_{i=1}^kf(r+i,1,r+i)-f(r+i,1,l-1)\)
前面的最多只有\(O(n)\)种。
对于后面的,我们考虑把所有形如\(\forall p\in[l,r],f(p,1,i)\)这样的询问的\([l,r]\)挂在\([1,i]\)的右端点\(i\)上。
总共会挂\(O(n)\)个长度总和为\(O(n\sqrt n)\)的区间。
考虑扫描线,从左往右计算,记录一些\([1,i]\)的信息,然后把挂在\(i\)的询问拿出来,\(O(1)\)地计算各个\(f(x,1,i)\)。相当于\(O(n)\)次插入和\(O(n\sqrt n)\)次询问。
有的时候也可以\(O(\sqrt n)\)地计算\(\sum\limits_{x=l}^rf(x,1,i)\)

posted @ 2020-01-18 19:49  Shiina_Mashiro  阅读(228)  评论(0)    收藏  举报